枚举的Java通用绑定(约束)

枚举的Java通用绑定(约束),java,generics,enums,constraints,bounds,Java,Generics,Enums,Constraints,Bounds,我试图将Java泛型类型变量绑定(约束)为枚举(任意枚举),但失败了。你能告诉我为什么吗 import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.cellprocessor.ift.StringCellProcessor; public class ParseEnum<TEnum extends Enum> extends CellProcessorAdaptor implements Str

我试图将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 {
            ...
        }
        ...
}
import org.supercsv.cellprocessor.ift.cellprocessor;
导入org.supercsv.cellprocessor.ift.StringCellProcessor;
公共类ParseEnum扩展CellProcessorAdaptor实现StringCellProcessor{
公共对象执行(最终对象值、最终CsvContext上下文){
...
最终十年结果;
if(TEnum的值instanceof){
结果=(十)个数值;
}else if(字符串的值实例){
结果=TEnum.valueOf((字符串)值);
}否则{
...
}
...
}
(这些是我试图扩展超级处理器的实际代码的部分。)

value instanceof TEnum
给了我这个错误(在Eclipse中):

“无法对类型参数TEnum执行instanceof检查。请使用其 由于将显示更多的泛型类型信息,因此请改为擦除枚举 “在运行时删除”

TEnum.valueOf((字符串)值)
给我这个错误:

类型枚举中的方法valueOf(Class,String)不正确 适用于参数(字符串)”


您必须传递enum类才能这样做(就像
EnumSet.allOf()
does)

公共类ParseEnum扩展CellProcessor适配器实现StringCellProcessor{
私有类枚举类型;
公共ParseEnum(类enumType){
this.enumType=enumType;
}
公共对象执行(最终对象值、最终CsvContext上下文){
...
最终十年结果;
if(value.getClass().equals(enumType)){
结果=(十)个数值;
} 
else if(字符串的值实例){
结果=枚举.valueOf(枚举类型,(字符串)值);
} 
否则{
...
}

第二个问题很简单:该方法有两个参数!谢谢!但我相信这会破坏与SuperCSV的约定。为什么我不能在execute中使用TEnum.class?因为正如错误消息所示,Java使用擦除。泛型类型仅在编译时检查。在运行时,泛型的实际具体类型是meter(TEnum)未知。JVM只知道它是Enum的一个实例。再次感谢JB Nizet。我敢问一下-为什么?为什么具体类型在运行时未知?因为Java没有真正的、具体化的泛型。只有在编译时才检查类型安全性,并且泛型类型被编译器“擦除”。请参阅
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 {
            ...
        }