{"record":{"id":"fff843e2768bb8e3","repo":"apple/pkl","slug":"cannot-parameterize-s-because-it-does-not-have","errorCode":null,"errorMessage":"Cannot parameterize `%s` because it does not have any type parameters.","messagePattern":"Cannot parameterize `(.+?)` because it does not have any type parameters\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pkl-config-java/src/main/java/org/pkl/config/java/mapper/Types.java","lineNumber":35,"sourceCode":"\nimport io.leangen.geantyref.TypeArgumentNotInBoundException;\nimport io.leangen.geantyref.TypeFactory;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.*;\nimport org.pkl.core.Pair;\n\n/**\n * A factory for parameterized type literals such as {@code List<String>} or {@code MyClass<Foo,\n * Bar>}. Used to express the desired target type in {@link ValueMapper#map(Object, Type)}.\n */\npublic final class Types {\n  private Types() {}\n\n  public static ParameterizedType parameterizedType(Class<?> rawType, Type... typeArguments) {\n    var typeParamsCount = rawType.getTypeParameters().length;\n    if (typeParamsCount == 0) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Cannot parameterize `%s` because it does not have any type parameters.\",\n              rawType.getTypeName()));\n    }\n    if (typeArguments.length != typeParamsCount) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Expected %d type arguments for `%s`, but got %d.\",\n              typeParamsCount, rawType.getTypeName(), typeArguments.length));\n    }\n    for (Type arg : typeArguments) {\n      if (arg instanceof Class<?> clazz) {\n        if (clazz.isPrimitive()) {\n          throw new IllegalArgumentException(\n              String.format(\n                  \"`%s.class` is not a valid type argument. Did you mean `%s.class`?\",\n                  clazz, Reflection.toWrapperType(clazz).getSimpleName()));\n        }","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-config-java/src/main/java/org/pkl/config/java/mapper/Types.java#L17-L53","documentation":"Types.parameterizedType() builds a ParameterizedType from a raw class plus type arguments. If the raw class declares zero type parameters there is nothing to parameterize, so it throws instead of silently ignoring the arguments.","triggerScenarios":"parameterizedType(String.class, ...) or any call with a non-generic class; also via helpers like Types.listOf/pairOf only if given a raw class without parameters.","commonSituations":"Passing String.class or Integer.class where List.class/Map.class was intended; wrapping a non-generic custom class that was expected to be generic.","solutions":["Use the raw class directly instead of parameterizing it.","Pass a generic class (e.g. List.class, Optional.class) if you meant a parameterized type.","Check rawType.getTypeParameters().length > 0 before calling."],"exampleFix":"// before\nTypes.parameterizedType(String.class, Integer.class);\n// after\nTypes.parameterizedType(List.class, String.class);","handlingStrategy":"validation","validationCode":"if (rawType.getTypeParameters().length == 0) throw new IllegalArgumentException(rawType + \" has no type parameters\");","typeGuard":"static boolean isGeneric(Class<?> c) { return c.getTypeParameters().length > 0; }","tryCatchPattern":"try { Types.parameterizedType(raw, args); } catch (IllegalArgumentException e) { /* use raw class directly */ }","preventionTips":["Only call parameterizedType on genuinely generic classes","Keep raw class constants like Types.listOf/List.class in shared helpers"],"tags":["java","generics","parameterized-type","illegal-argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}