{"record":{"id":"1777b569e84ab7e6","repo":"apache/beam","slug":"cannot-provide-a-coder-for-wildcard-type-s","errorCode":null,"errorMessage":"Cannot provide a coder for wildcard type %s.","messagePattern":"Cannot provide a coder for wildcard type (.+?)\\.","errorType":"exception","errorClass":"CannotProvideCoderException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java","lineNumber":635,"sourceCode":"        coder = Iterables.getOnlyElement(coders);\n      } else {\n        throw new CannotProvideCoderException(\n            String.format(\n                \"Cannot provide a coder for type variable %s\"\n                    + \" because the actual type is over specified by multiple\"\n                    + \" incompatible coders %s.\",\n                type, coders),\n            ReasonCode.OVER_SPECIFIED);\n      }\n    } else if (type instanceof Class<?>) {\n      coder = getCoderFromFactories(typeDescriptor, Collections.emptyList());\n    } else if (type instanceof ParameterizedType) {\n      coder = getCoderFromParameterizedType((ParameterizedType) type, typeCoderBindings);\n    } else if (type instanceof TypeVariable) {\n      coder = getCoderFromFactories(typeDescriptor, Collections.emptyList());\n    } else if (type instanceof WildcardType) {\n      // No coder for an unknown generic type.\n      throw new CannotProvideCoderException(\n          String.format(\"Cannot provide a coder for wildcard type %s.\", type), ReasonCode.UNKNOWN);\n    } else {\n      throw new RuntimeException(\"Internal error: unexpected kind of Type: \" + type);\n    }\n\n    LOG.debug(\"Coder for {}: {}\", typeDescriptor, coder);\n    @SuppressWarnings(\"unchecked\")\n    Coder<T> result = (Coder<T>) coder;\n    return result;\n  }\n\n  /**\n   * Returns a {@link Coder} to use for values of the given parameterized type, in a context where\n   * the given types use the given {@link Coder Coders}.\n   *\n   * @throws CannotProvideCoderException if no coder can be provided\n   */\n  private Coder<?> getCoderFromParameterizedType(","sourceCodeStart":617,"sourceCodeEnd":653,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java#L617-L653","documentation":"Java wildcard types (e.g. List<?>) carry no concrete element type, so the registry cannot determine or verify a coder for them. getCoderFromTypeDescriptor throws CannotProvideCoderException with ReasonCode.UNKNOWN for any WildcardType. The library deliberately refuses to guess a coder for an unknown generic type.","triggerScenarios":"Requesting a coder for a TypeDescriptor whose underlying Type is a WildcardType — e.g. CoderRegistry.getCoder(new TypeDescriptor<List<?>>() {}) or a parameterized type argument that resolves to a wildcard.","commonSituations":"Generic APIs typed with wildcards (PCollection<List<?>>); reflection-derived Type objects from frameworks that produce wildcards; incomplete type tokens using ? instead of concrete classes.","solutions":["Replace the wildcard with a concrete type in the TypeDescriptor (e.g. List<String> instead of List<?>).","Add an upper bound (List<? extends Foo>) and register a coder for Foo, then request the coder for the bounded type.","Have the API surface use concrete generic parameters instead of wildcards."],"exampleFix":"// before\nCoder<List<?>> coder = registry.getCoder(new TypeDescriptor<List<?>>() {});\n// after\nCoder<List<String>> coder = registry.getCoder(new TypeDescriptor<List<String>>() {});","handlingStrategy":"type-guard","validationCode":"if (typeDescriptor.getType() instanceof WildcardType) {\n  throw new IllegalArgumentException(\"Provide a concrete type instead of a wildcard\");\n}","typeGuard":"static boolean isWildcard(TypeDescriptor<?> td) {\n  return td.getType() instanceof WildcardType;\n}","tryCatchPattern":"try {\n  coder = registry.getCoder(td);\n} catch (CannotProvideCoderException e) {\n  // wildcard: request coder for concrete bounded type instead\n}","preventionTips":["Avoid ? type arguments in TypeDescriptor tokens used for coder lookup.","Use bounded wildcards and register coders for the bound.","Prefer concrete generic types in pipeline APIs."],"tags":["java","apache-beam","generics","wildcard"],"backgroundTag":"unsupported-operation","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"}