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 检查。改用它的擦除枚举,因为更多的泛型类型信息将在运行时被擦除”

TEnum.valueOf((String)value)给我这个错误:

“枚举类型中的方法 valueOf(Class, String) 不适用于参数 (String)”

4

1 回答 1

7

您必须通过枚举类才能做到这一点(就像这样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 回答