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

4

我有一个类,想在其中使用通用的枚举类型,就像这样:

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

看起来我应该在那个类里面拥有一个getter方法,然后可以返回一个枚举<E>实例,就像这样:

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

但我一直收到以下错误:

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

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

2个回答

6

你不能对 E 调用 valueOf 方法:因为它不是一个对象,而只是一个类型参数。

你应该传递当前枚举类型参数的 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的类,因此您需要明确指定它。


他可以做的事情是创建一个包装器,存储他感兴趣的对象和类变量,以包含存储对象的类型。 - Thamiar

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)

由于枚举类型的实际类型是未知的,因此无法调用valueOf(String)方法,编译器会认为你试图调用

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                            String name)

那实际上是你应该调用的方法。但这意味着你的泛型类需要引用枚举类的Class。就像EnumSet一样,例如。请查看@Tunaki的答案以获得示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接