{"record":{"id":"8ba146dcf86a5cac","repo":"apache/beam","slug":"cound-not-determine-array-parameter-type-for-field","errorCode":null,"errorMessage":"Cound not determine array parameter type for field.","messagePattern":"Cound not determine array parameter type for field\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldTypeDescriptors.java","lineNumber":143,"sourceCode":"    if (iterable.getType() instanceof ParameterizedType) {\n      ParameterizedType ptype = (ParameterizedType) iterable.getType();\n      java.lang.reflect.Type[] params = ptype.getActualTypeArguments();\n      checkArgument(params.length == 1);\n      return FieldType.iterable(fieldTypeForJavaType(TypeDescriptor.of(params[0])));\n    }\n    throw new RuntimeException(\"Could not determine array parameter type for field.\");\n  }\n\n  private static FieldType getMapFieldType(TypeDescriptor typeDescriptor) {\n    TypeDescriptor<Collection<?>> map = typeDescriptor.getSupertype(Map.class);\n    if (map.getType() instanceof ParameterizedType) {\n      ParameterizedType ptype = (ParameterizedType) map.getType();\n      java.lang.reflect.Type[] params = ptype.getActualTypeArguments();\n      return FieldType.map(\n          fieldTypeForJavaType(TypeDescriptor.of(params[0])),\n          fieldTypeForJavaType(TypeDescriptor.of(params[1])));\n    }\n    throw new RuntimeException(\"Cound not determine array parameter type for field.\");\n  }\n}\n","sourceCodeStart":125,"sourceCodeEnd":146,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldTypeDescriptors.java#L125-L146","documentation":"Thrown by getMapFieldType when a schema'd field is a Map type but Beam cannot extract exactly two type parameters (key and value) from it. The message text (\"Cound not...\") contains a known typo. Typically raised when the Map supertype is raw or has fewer than two actual type arguments.","triggerScenarios":"A field/getter declared as raw Map or a Map subtype without both key and value generics; getMapFieldType fetches getSupertype(Map.class) and params do not yield two usable types.","commonSituations":"Raw `Map map` in a JavaBean; custom map classes extending raw Map; classes processed by tools that strip generic signatures.","solutions":["Declare the map with both type parameters (e.g. Map<String, Integer>).","For custom map classes, extend Map<K,V> with concrete type arguments.","Use @SchemaCreate or a custom user type if the type cannot be parameterized."],"exampleFix":"// before\nprivate Map lookup;\n\n// after\nprivate Map<String, Double> lookup;","handlingStrategy":"type-guard","validationCode":"if (!(td.getType() instanceof java.lang.reflect.ParameterizedType) || ((java.lang.reflect.ParameterizedType) td.getType()).getActualTypeArguments().length != 2) { throw new IllegalStateException(\"Map field must declare key and value types\"); }","typeGuard":"static boolean isTypedMap(TypeDescriptor<?> td) { return Map.class.isAssignableFrom(td.getRawType()) && td.getType() instanceof java.lang.reflect.ParameterizedType && ((java.lang.reflect.ParameterizedType) td.getType()).getActualTypeArguments().length == 2; }","tryCatchPattern":"try { schemaOf(MyBean.class); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"Cound not determine\")) { /* add <K,V> to Map field */ } else { throw e; } }","preventionTips":["Always declare Map<K,V> with both type parameters.","Extend AbstractMap<K,V> with concrete types in custom map classes.","Test schema inference for every POJO in CI."],"tags":["java","beam-schema","type-erasure","reflection"],"backgroundTag":"type-mismatch","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}