簡體   English   中英

我的通用EnumSet方法-無法訪問Enum.values()

[英]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()

為此,您需要EClass對象的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM