{"record":{"id":"a7eb252db84d962e","repo":"apple/pkl","slug":"target-type-s-is-missing-type-arguments","errorCode":null,"errorMessage":"Target type `%s` is missing type arguments.","messagePattern":"Target type `(.+?)` is missing type arguments\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pkl-config-java/src/main/java/org/pkl/config/java/mapper/ValueMapperImpl.java","lineNumber":82,"sourceCode":"      return rawTargetType;\n    }\n    var rawRegisteredSchema = Reflection.toRawType(determinedClass);\n    if (rawTargetType.isAssignableFrom(rawRegisteredSchema)) {\n      return rawRegisteredSchema;\n    }\n    return rawTargetType;\n  }\n\n  @Override\n  public <S, T> Converter<S, T> getConverter(PClassInfo<S> sourceType, Type targetType) {\n    Tuple2<PClassInfo<?>, Type> key = Tuple2.of(sourceType, targetType);\n\n    @SuppressWarnings(\"unchecked\")\n    Converter<S, T> converter = (Converter<S, T>) convertersMap.get(key);\n    if (converter != null) return converter;\n\n    if (Reflection.isMissingTypeArguments(targetType)) {\n      throw new IllegalArgumentException(\n          String.format(\"Target type `%s` is missing type arguments.\", targetType));\n    }\n\n    Class<?> rawTargetType = getTargetType(sourceType, targetType);\n    @SuppressWarnings(\"unchecked\")\n    var rawImplType = (Class<T>) typeMappingsMap.getOrDefault(rawTargetType, rawTargetType);\n    var implType = Reflection.getExactSubtype(targetType, rawImplType);\n\n    // look up implType converter\n    // because implType has wildcards removed, conversion to\n    // `? extends Number` or `? super Number` finds converter for `Number`\n    // (assuming `converters` has such a converter)\n    var implKey = Tuple2.of(sourceType, implType);\n    @SuppressWarnings(\"unchecked\")\n    var implConverter = (Converter<S, T>) convertersMap.get(implKey);\n    if (implConverter != null) {\n      // TODO: give converter a chance to copy itself to avoid pollution of its inline caches\n      convertersMap.put(key, implConverter);","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-config-java/src/main/java/org/pkl/config/java/mapper/ValueMapperImpl.java#L64-L100","documentation":"ValueMapperImpl.getConverter looks up/builds a Converter for (sourceType, targetType). If targetType is a parameterized type whose arguments were erased/unspecified (Reflection.isMissingTypeArguments), the mapper cannot know what to convert to and refuses with this error rather than guessing.","triggerScenarios":"Calling valueMapper.map(source, targetType) with a raw generic Class such as List.class or Map.class as the target, or a Type whose actual type arguments are absent.","commonSituations":"Passing List.class instead of a ParameterizedType built via Types.parameterizedType/List.of-style typing; obtaining the target Type via reflection from an erased field or method return.","solutions":["Pass a fully parameterized target type, e.g. Types.parameterizedType(List.class, String.class).","Use the Types helpers (listOf, setOf, mapOf-equivalent) to construct the target type.","Avoid erased Types from reflection; use getGenericType() instead of getReturnType()/getClass()."],"exampleFix":"// before\nmapper.map(pklObject, List.class);\n// after\nmapper.map(pklObject, Types.parameterizedType(List.class, String.class));","handlingStrategy":"type-guard","validationCode":"if (targetType instanceof Class<?> c && c.getTypeParameters().length > 0) throw new IllegalArgumentException(\"parameterize \" + c);","typeGuard":"static boolean hasTypeArguments(Type t) { return t instanceof ParameterizedType || (t instanceof Class<?> c && c.getTypeParameters().length == 0); }","tryCatchPattern":"try { mapper.map(src, targetType); } catch (IllegalArgumentException e) { /* rebuild targetType with Types.parameterizedType */ }","preventionTips":["Never pass raw generic Classes (List.class, Map.class) as mapping targets","Use field.getGenericType()/Types helpers rather than erased Types from reflection"],"tags":["java","generics","type-erasure","value-mapper"],"backgroundTag":"missing-argument-type","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"}