apache/seatunnel · error · UnsupportedOperationException

Unsupported generics convert

Error message

Unsupported generics convert

What it means

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.

Source

Thrown at seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/source/arrow/converter/Converter.java:35

package org.apache.seatunnel.connectors.seatunnel.common.source.arrow.converter;

import org.apache.seatunnel.shade.org.apache.arrow.vector.FieldVector;
import org.apache.seatunnel.shade.org.apache.arrow.vector.types.Types;

import java.util.Map;
import java.util.function.Function;

public interface Converter<T extends FieldVector> {

    String ARRAY_KEY = "ARRAY";
    String MAP_KEY = "KEY";
    String MAP_VALUE = "VALUE";

    Object convert(int rowIndex, T fieldVector);

    default Object convert(int rowIndex, T fieldVector, Map<String, Function> genericsConverters) {
        throw new UnsupportedOperationException("Unsupported generics convert");
    }

    boolean support(Types.MinorType type);
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. 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).
  2. Use the correct converter for the FieldVector type — map/struct/list vectors need the corresponding composite converter.
  3. If you wrote a custom Converter, override convert(rowIndex, fieldVector, genericsConverters) instead of relying on the default.
  4. Inspect the FieldVector's children types; a mismatch between expected and actual Arrow type usually routes to the wrong converter.

Example fix

// before
Object v = intConverter.convert(rowIndex, vector, genericsConverters); // throws
// after
Converter c = converterFor(fieldVector);
Object v = (genericsConverters != null && c.overridesGenericsConvert())
        ? c.convert(rowIndex, vector, genericsConverters)
        : c.convert(rowIndex, vector);
Defensive patterns

Strategy: type-guard

Validate before calling

// only use the generics-aware path when the converter supports it
boolean canUseGenerics = converter instanceof Converter<?> c
        && !(c.getClass().equals(Converter.class)) /* overrides the overload */;

Type guard

boolean supportsGenericsConvert(Converter<?> c, Types.MinorType type) {
    return c.support(type) && GenericsCapable.class.isInstance(c); // only composite converters
}

Try / catch

try {
    return converter.convert(rowIndex, fieldVector, genericsConverters);
} catch (UnsupportedOperationException e) {
    return converter.convert(rowIndex, fieldVector); // fall back to plain conversion
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/d844c4ea95b4c230. Report an issue: GitHub.