5

Java ジェネリック型変数を列挙型 (任意の列挙型) にバインド (制約) しようとしていますが、失敗しています。理由を教えていただけないでしょうか。

import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;

public class ParseEnum<TEnum extends Enum> extends CellProcessorAdaptor implements StringCellProcessor {

    public Object execute(final Object value, final CsvContext context) {
        ...
        final TEnum result;
        if (value instanceof TEnum) {
            result = (TEnum) value;
        } else if( value instanceof String ) {
                result = TEnum.valueOf((String)value);
        } else {
            ...
        }
        ...
}

(これらは、SuperCSV CellProcessor を拡張しようとしている実際のコードの一部です。)

value instanceof TEnumこのエラーが表示されます(Eclipseで):

「型パラメーター TEnum に対して instanceof チェックを実行できません。実行時にさらにジェネリック型情報が消去されるため、代わりにその消去 Enum を使用してください」

TEnum.valueOf((String)value)このエラーが表示されます:

「Enum 型のメソッド valueOf(Class, String) は、引数 (String) には適用できません」

4

1 に答える 1

7

これを行うには、enum クラスを渡す必要があります (同様EnumSet.allOf()に)。

public class ParseEnum<TEnum extends Enum<TEnum>> extends CellProcessorAdaptor implements StringCellProcessor {

    private Class<TEnum> enumType;

    public ParseEnum(Class<TEnum> enumType) {
        this.enumType = enumType;
    }

    public Object execute(final Object value, final CsvContext context) {
        ...
        final TEnum result;
        if (value.getClass().equals(enumType)) {
            result = (TEnum) value;
        } 
        else if (value instanceof String) {
            result = Enum.valueOf(enumType, (String) value);
        } 
        else {
            ...
        }
于 2013-02-11T14:35:39.863 に答える