2013-03-05 58 views
0

我想写一个泛型方法来初始化一个EnumSet值从一个包含位掩码的整数。我收到一个编译器错误,我不明白。这里是我的代码:我的泛型EnumSet方法 - 无法访问Enum.values()

private <E extends Enum<E>> void setEnumSet(EnumSet<E> es, int iEnum) { 
     es.clear(); 
     for (E e : E.values()) { 
     if (0 != (iEnum & (1<<e.ordinal()))) { 
      es.add(e); 
     } 
     }    
    } 

编译器错误:

1>Javac... 
1>.\wdqapi.java:266: error: cannot find symbol 
1>  for (E e : E.values()) { 
1>    ^
1> symbol: method values() 
1> location: class Enum<E> 
1> where E is a type-variable: 
1> E extends Enum<E> declared in method <E>_setEnumSet(EnumSet<E>,int) 

是否有访问高值e()方法的一些特殊的语法? (我是Java noob。)有人可以帮我解决这个编译器错误吗?谢谢。

回答

4

您不能直接对泛型进行操作,因为在运行时类型擦除将所有这些替换为Object。因此,上面的代码会做Object.values(),这显然不起作用。

做到这一点的方法是使用Class.getEnumConstants()

要做到这一点,你需要的EClass对象E一个实例。同样,请记住,在运行时,type-erasure将删除对泛型的所有引用。

尝试类似:

private <E extends Enum<E>> void setEnumSet(E[] values, 
     EnumSet<E> es, int iEnum) 

private <E extends Enum<E>> void setEnumSet(Class<E> type, 
     EnumSet<E> es, int iEnum) 
+0

谢谢,约翰。我以传入值数组的方式去了。似乎多余,但它完成了工作。 tyvm - 特别是对于及时性! :) – jbirkel 2013-03-05 18:34:04

0

作为替代传递值数组中,你可以从EnumSet恢复Class<E>。如果该集合不为空,则使用set.iterator().next().getDeclaringClass();如果该集合为空,则使用EnumSet.complementOf(set)获取非空集合,然后获取元素并像以前一样获取其类。 (奇怪的是,EnumSet并不尽管有保存它complementOf工作提供一种方法直接获得的枚举类。)

一旦你的Class对象,使用Class.getEnumConstants在约翰·B的答复中提到。