2012-07-26 95 views
13

我想用Enum中的所有可用值初始化泛型类。这是我想它是如何工作的:在泛型类中使用Enum.values扩展枚举

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

    E[] choices; 

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

然而,调用E.values在Eclipse中是不能接受的话,这种方法是未定义此E.

使用此构造,而不是被接受,但要求调用者提供的值:

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

在我找到的文档:

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

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

回答

20

您的最佳选择可能是将所需枚举的Class传递给构造函数。 (见一个EnumMap是如何构造的实例。)

然后可以使用clazz.getEnumConstants()得到的常量保持。

3

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

你也许可以做这样的事情在MyClass的构造:

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

我相信这已经无关类型擦除。问题的原因是'public static E [] values()'方法不是'java.lang.Enum'类中存在的方法。 [Java语言规范](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2)解释说,这种方法是综合生成的所有枚举。所以,在我看来,该方法存在于枚举的任何具体引用中,但不在枚举类本身中。 – 2012-07-26 07:28:53