15

我正在尝试使用枚举中的所有可用值初始化一个泛型类。这是我希望它的工作方式:

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

    E[] choices;

    public MyClass() {
        choices = E.values();
    }

但是,在 Eclipse 中不接受调用,E.values说这个方法对于这个 E 是未定义的。

接受使用此构造函数,但需要调用者提供值:

public MyClass(E[] e) {
    choices = e;
}

在我发现的文档中:

Java 编程语言的枚举类型比其他语言中的枚举类型强大得多。枚举声明定义了一个类(称为枚举类型)。枚举类主体可以包括方法和其他字段。编译器在创建枚举时会自动添加一些特殊方法。例如,它们有一个静态值方法,该方法返回一个数组,该数组按照声明的顺序包含枚举的所有值。

有没有办法解决这个问题?

4

2 回答 2

22

您最好的选择可能是Class将所需的枚举传递给构造函数。(例如,查看 anEnumMap是如何构造的。)

然后,您可以使用来获取常量。clazz.getEnumConstants()

于 2012-07-26T06:52:47.733 回答
3

由于泛型在 Java 中的实现方式以及称为类型擦除的现象,您的第一个代码片段不起作用。因此,JVM 将不知道E程序执行时的类型是什么。

您可能可以在MyClass的构造函数中执行以下操作:

public MyClass(E type) {
    choices = type.getDeclaringClass().getEnumConstants();
}
于 2012-07-26T06:58:22.883 回答