我有一个课程,我想要使用通用枚举类型,如下所示:
public class PageField<E extends Enum<E>>{
}
看起来我应该能够在该类中使用getter方法,然后可以返回枚举<E>
实例,如下所示:
public E getSelectedValue() {
String value = getValueFromElement(this.id);
return E.valueOf(value);
}
但我不断收到以下错误:
推断类型&#39; java.lang.Object&#39;对于类型参数&#39; T&#39;不在其范围内;应该扩展&#39; java.lang.Enum&#39;
我做错了什么?这可能吗?
答案 0 :(得分:4)
你不能在valueOf
上调用方法E
:它不是一个对象,它只是一个类型参数。
您应该做的是传递当前枚举类型参数的Class
,以便您可以使用它来检索枚举值:
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);
}
}
不幸的是,由于类型擦除,无法检索类型E
的类,因此您需要明确地给它。
答案 1 :(得分:3)
编译器的实际错误消息是
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)
由于enum的实际类型未知,因此无法调用valueOf(String)
,并且编译器认为您正在尝试调用
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name)
这实际上是你应该打电话的方法。但这意味着您的泛型类需要引用枚举的类。就像EnumSet一样。请参阅@Tunaki的答案。