{"record":{"id":"d844c4ea95b4c230","repo":"apache/seatunnel","slug":"unsupported-generics-convert","errorCode":null,"errorMessage":"Unsupported generics convert","messagePattern":"Unsupported generics convert","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/source/arrow/converter/Converter.java","lineNumber":35,"sourceCode":"\npackage org.apache.seatunnel.connectors.seatunnel.common.source.arrow.converter;\n\nimport org.apache.seatunnel.shade.org.apache.arrow.vector.FieldVector;\nimport org.apache.seatunnel.shade.org.apache.arrow.vector.types.Types;\n\nimport java.util.Map;\nimport java.util.function.Function;\n\npublic interface Converter<T extends FieldVector> {\n\n    String ARRAY_KEY = \"ARRAY\";\n    String MAP_KEY = \"KEY\";\n    String MAP_VALUE = \"VALUE\";\n\n    Object convert(int rowIndex, T fieldVector);\n\n    default Object convert(int rowIndex, T fieldVector, Map<String, Function> genericsConverters) {\n        throw new UnsupportedOperationException(\"Unsupported generics convert\");\n    }\n\n    boolean support(Types.MinorType type);\n}\n","sourceCodeStart":17,"sourceCodeEnd":40,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/source/arrow/converter/Converter.java#L17-L40","documentation":"Converter's default convert(rowIndex, fieldVector, genericsConverters) method exists only for converters that support map/generic-aware conversion (e.g. the Map converter); the interface's default implementation throws UnsupportedOperationException(\"Unsupported generics convert\"). Calling it on a converter that doesn't support generic conversion is an API misuse.","triggerScenarios":"Calling the three-argument convert(...) with a genericsConverters map on a Converter implementation that did not override it — e.g. invoking convertMap/convertedValue/convertRow against a scalar converter like IntConverter or StringConverter.","commonSituations":"Arrow FieldVectors whose minor type matches a simple converter but whose children (lists, maps, structs) require the generic path; custom Converter implementations that forgot to override the generics-aware overload while the reader dispatches to it.","solutions":["Ensure the dispatch code calls the three-argument convert only for converters that support it (check converter.support(type) and whether it overrides the overload).","Use the correct converter for the FieldVector type — map/struct/list vectors need the corresponding composite converter.","If you wrote a custom Converter, override convert(rowIndex, fieldVector, genericsConverters) instead of relying on the default.","Inspect the FieldVector's children types; a mismatch between expected and actual Arrow type usually routes to the wrong converter."],"exampleFix":"// before\nObject v = intConverter.convert(rowIndex, vector, genericsConverters); // throws\n// after\nConverter c = converterFor(fieldVector);\nObject v = (genericsConverters != null && c.overridesGenericsConvert())\n        ? c.convert(rowIndex, vector, genericsConverters)\n        : c.convert(rowIndex, vector);","handlingStrategy":"type-guard","validationCode":"// only use the generics-aware path when the converter supports it\nboolean canUseGenerics = converter instanceof Converter<?> c\n        && !(c.getClass().equals(Converter.class)) /* overrides the overload */;","typeGuard":"boolean supportsGenericsConvert(Converter<?> c, Types.MinorType type) {\n    return c.support(type) && GenericsCapable.class.isInstance(c); // only composite converters\n}","tryCatchPattern":"try {\n    return converter.convert(rowIndex, fieldVector, genericsConverters);\n} catch (UnsupportedOperationException e) {\n    return converter.convert(rowIndex, fieldVector); // fall back to plain conversion\n}","preventionTips":["Route map/struct/list FieldVectors to their dedicated composite converters.","Override the generics-aware convert overload in any custom Converter.","Match converter selection to the FieldVector's minor type and children before calling convert."],"tags":["arrow","converter","unsupported-operation","api-misuse"],"backgroundTag":"method-not-implemented","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}