![](/img/trans.png)
[英]Enum.values() vs EnumSet.allOf( ). Which one is more preferable?
[英]My generic EnumSet method - can't access Enum.values()
我正在嘗試編寫一種通用方法,用於從包含位掩碼的整數初始化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菜鳥。)有人可以幫助我解決此編譯器錯誤嗎? 謝謝。
您不能直接對泛型類型執行操作,因為在運行時,類型擦除會將所有這些替換為Object
。 因此,以上代碼將執行Object.values()
,這顯然不起作用。
做到這一點的方法是使用Class.getEnumConstants()
為此,您需要E
的Class
對象的E
的實例。 同樣,請記住,在運行時類型擦除將刪除對通用類型的所有引用。
嘗試類似:
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 )
作為傳入values數組的替代方法,您可以從EnumSet
恢復Class<E>
。 如果集合不為空,請使用set.iterator().next().getDeclaringClass()
; 如果集合為空,則使用EnumSet.complementOf(set)
獲取一個非空集合,然后像以前一樣獲取一個元素並獲取其類。 (奇怪的是,EnumSet沒有提供直接獲取枚舉類的方法,盡管必須存儲它以使complementOf
起作用。)
獲得Class對象后,請使用John B的答案中提到的Class.getEnumConstants
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.