将Enum.values与扩展Enum的泛型类一起使用

时间:2012-07-26 06:49:52

标签: java generics enums

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

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

    E[] choices;

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

但是,Eclipse中不接受对E.values的调用,因为此方法未定义此方法。

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

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

在我找到的文档中:

  

Java编程语言枚举类型比它们强大得多   其他语言的同行。枚举声明定义了一个类   (称为枚举类型)。枚举类主体可以包括方法和   其他领域。编译器会自动添加一些特殊方法   当它创建一个枚举。例如,他们有一个静态值方法   返回一个包含所有枚举值的数组   命令他们被宣布。

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

2 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:3)

您的第一个代码段不起作用,因为Generics是如何在Java中实现的,并且由于称为type erasure的现象。因此,当程序执行时,JVM将不知道E的类型是什么。

你可以在MyClass的构造函数中执行类似的操作:

public MyClass(E type) {
    choices = type.getDeclaringClass().getEnumConstants();
}