{"record":{"id":"9d72d038eb5ce749","repo":"apache/cassandra","slug":"listtype-takes-exactly-1-type-parameter","errorCode":null,"errorMessage":"ListType takes exactly 1 type parameter","messagePattern":"ListType takes exactly 1 type parameter","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/ListType.java","lineNumber":62,"sourceCode":"import org.apache.cassandra.utils.bytecomparable.ByteSource;\n\nimport static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;\n\npublic class ListType<T> extends CollectionType<List<T>>\n{\n    // interning instances\n    private static final ConcurrentHashMap<AbstractType<?>, ListType> instances = new ConcurrentHashMap<>();\n    private static final ConcurrentHashMap<AbstractType<?>, ListType> frozenInstances = new ConcurrentHashMap<>();\n\n    private final AbstractType<T> elements;\n    private final ListSerializer<T> serializer;\n    private final boolean isMultiCell;\n\n    public static ListType<?> getInstance(TypeParser parser) throws ConfigurationException, SyntaxException\n    {\n        List<AbstractType<?>> l = parser.getTypeParameters();\n        if (l.size() != 1)\n            throw new ConfigurationException(\"ListType takes exactly 1 type parameter\");\n\n        return getInstance(l.get(0).freeze(), true);\n    }\n\n    public static <T> ListType<T> getInstance(AbstractType<T> elements, boolean isMultiCell)\n    {\n        ConcurrentHashMap<AbstractType<?>, ListType> internMap = isMultiCell ? instances : frozenInstances;\n        ListType<T> t = internMap.get(elements);\n        return null == t\n             ? internMap.computeIfAbsent(elements, k -> new ListType<>(k, isMultiCell))\n             : t;\n    }\n\n    private ListType(AbstractType<T> elements, boolean isMultiCell)\n    {\n        super(ComparisonType.CUSTOM, Kind.LIST);\n        this.elements = elements;\n        this.serializer = ListSerializer.getInstance(elements.getSerializer());","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/ListType.java#L44-L80","documentation":"ListType.getInstance(TypeParser) builds a ListType from parsed type parameters. A list type requires exactly one element type parameter (e.g. list<int>); supplying zero or multiple parameters is invalid and throws ConfigurationException.","triggerScenarios":"Declaring or parsing a type string like 'list<>' or 'list<int,int>' via TypeParser; programmatic parser misuse passing a parameter list whose size != 1.","commonSituations":"Typoed CQL schema definitions; dynamically generated type strings built incorrectly; copy/paste from multi-argument types like map<k,v> into a list definition.","solutions":["Fix the type declaration to contain exactly one element type: list<int>, list<text>, etc.","Validate type strings before applying schema changes.","If a key-value collection was intended, use map<k,v> or set<t> instead."],"exampleFix":"// before\nCREATE TABLE t (tags list<text, int> PRIMARY KEY ...);\n// after\nCREATE TABLE t (tags list<text> PRIMARY KEY ...);","handlingStrategy":"validation","validationCode":"List<AbstractType<?>> params = parser.getTypeParameters();\nif (params.size() != 1) throw new IllegalArgumentException(\"list<T> requires exactly one type parameter\");","typeGuard":null,"tryCatchPattern":"try { type = ListType.getInstance(parser); } catch (ConfigurationException e) { throw new SchemaException(\"Bad list declaration: \" + e.getMessage()); }","preventionTips":["Double-check type declarations: list has one parameter, map has two, set has one.","Catch ConfigurationException when parsing user-supplied type strings.","Lint dynamically generated type strings in tests."],"tags":["schema","type-parser","list","configuration"],"backgroundTag":"invalid-argument-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}