我想用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编程语言枚举类型比其他语言中的 对等更强大。枚举声明定义了一个类 (称为枚举类型)。枚举类的主体可以包含其他字段的方法和 。编译器在创建枚举时会自动添加一些特殊方法 。例如,它们有一个静态值方法 ,该方法返回一个数组,其中包含枚举的所有值,其排列顺序为 。
有没有办法解决这个问题?
我相信这已经无关类型擦除。问题的原因是'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
如果有两个类,'公共类A { \t \t 公共静态无效测试(){} }'和'公共B类 { \t \t 公共B(){A.test(); },行A.test()仍然是一个编译时错误,因为在运行时,如果没有明确定义A,编译器就不会知道A的类型,比如说传递给构造函数的类型A的参数。 – Jeshurun 2012-07-26 07:44:28
@Jeshrun不,它不是。这是一个编译时错误,因为在你的声明中,'B'''A'是一个无限类型的参数。这个声明中的'A'与'A'类没有任何关系。如果你声明它为'B',那么它会被编译吗?声明在类型参数和类名之间没有明显的歧义,并且使用对T的引用? –
2012-07-26 07:56:15