2013-03-05 20 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的答覆中提到。