我的通用EnumSet方法 - 无法访问Enum.values()

时间:2013-03-05 17:54:39

标签: java generics enumset

我正在尝试编写一个泛型方法,用于从包含位掩码的整数初始化EnumSet值。我收到编译错误,我不明白。这是我的代码:

   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的values()方法? (我是一个Java noob。)有人可以帮我解决这个编译错误吗?感谢。

2 个答案:

答案 0 :(得分:4)

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

执行此操作的方法是使用Class.getEnumConstants()

要执行此操作,您需要E Class E对象private <E extends Enum<E>> void setEnumSet(E[] values, EnumSet<E> es, int iEnum ) 的实例。同样,请记住,在运行时,type-erasure将删除对泛型类型的所有引用。

尝试类似:

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

{{1}}

答案 1 :(得分:0)

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

获得Class对象后,请使用John B&#39>中提到的Class.getEnumConstants