如何在Java中使用泛型枚举类型从类返回枚举

如何在Java中使用泛型枚举类型从类返回枚举,java,generics,enums,Java,Generics,Enums,我有一个类,我想在其中使用泛型枚举类型,如下所示: public class PageField<E extends Enum<E>>{ } public E getSelectedValue() { String value = getValueFromElement(this.id); return E.valueOf(value); } 但我一直得到以下错误: 类型参数“T”的推断类型“java.lang.Object”不在其范围内;应扩展“ja

我有一个类,我想在其中使用泛型枚举类型,如下所示:

public class PageField<E extends Enum<E>>{
}
public E getSelectedValue() {
    String value = getValueFromElement(this.id);
    return E.valueOf(value);
}
但我一直得到以下错误:

类型参数“T”的推断类型“java.lang.Object”不在其范围内;应扩展“java.lang.Enum”


我做错了什么?这可能吗?

您不能调用
E
上的
valueOf
方法:它不是一个对象,只是一个类型参数

您应该做的是传递当前枚举类型参数的
,以便使用它检索枚举值:

public class PageField<E extends Enum<E>>{

    private Class<E> enumClass;

    public PageField(Class<E> enumClass) {
        this.enumClass = enumClass;
    }

    public E getSelectedValue() {
        String value = getValueFromElement(this.id);
        return Enum.valueOf(enumClass, value);
    }

}
公共类页面字段{
私有类;
公共页面字段(类枚举类){
this.enumClass=enumClass;
}
公共E getSelectedValue(){
字符串值=getValueFromElement(this.id);
返回Enum.valueOf(enumClass,value);
}
}

不幸的是,由于类型擦除,无法检索
E
类型的类,因此您需要明确地给出它。

来自编译器的实际错误消息是

Error:(6, 17) java: method valueOf in class java.lang.Enum<E> cannot be applied to given types;
  required: java.lang.Class<T>,java.lang.String
  found: java.lang.String
  reason: cannot infer type-variable(s) T
    (actual and formal argument lists differ in length)

这实际上就是您应该调用的方法。但这意味着您的泛型类需要有对枚举类的引用。例如,正如EnumSet所做的那样。例如,请参见@Tunaki的答案。

要获得类的类型,他可以做的是创建一个包装器,存储他感兴趣的对象和包含存储对象类型的类变量。
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                            String name)