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

时间:2015-09-02 13:31:10

标签: java generics enums

我有一个课程,我想要使用通用枚举类型,如下所示:

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;

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

2 个答案:

答案 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的答案。