0

ビット マスクを含む整数から 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 初心者です。) 誰かがこのコンパイラ エラーを回避するのを手伝ってくれますか? ありがとう。

4

2 に答える 2

4

ジェネリック型に対して直接操作を行うことはできません。これは、実行時に型消去によってこれらすべてが に置き換えられるため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 )
于 2013-03-05T18:00:43.313 に答える
0

値配列を渡す代わりに、Class<E>からを復元できますEnumSet。セットが空でない場合は、set.iterator().next().getDeclaringClass();を使用します。セットが空の場合は、 を使用EnumSet.complementOf(set)して空でないセットを取得してから、以前と同様に要素を取得してそのクラスを取得します。(不思議なことに、EnumSet は列挙型クラスを直接取得するメソッドを提供していません。動作するために格納する必要がありcomplementOfます。)

Class オブジェクトを取得したらClass.getEnumConstants、John B の回答で述べたように使用します。

于 2014-05-23T14:41:20.503 に答える