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

Lim*_*awk 4 java generics enums

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

public class PageField<E extends Enum<E>>{
}
Run Code Online (Sandbox Code Playgroud)

看起来我应该能够在该类中拥有一个 getter 方法,然后可以返回一个枚举<E>实例,如下所示:

public E getSelectedValue() {
    String value = getValueFromElement(this.id);
    return E.valueOf(value);
}
Run Code Online (Sandbox Code Playgroud)

但我不断收到以下错误:

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

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

Tun*_*aki 6

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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