15

Enum から使用可能なすべての値を使用してジェネリック クラスを初期化しようとしています。これが私がそれをどのように機能させたいかです:

public class MyClass<E extends Enum<E>> {

    E[] choices;

    public MyClass() {
        choices = E.values();
    }

E.valuesただし、このメソッドはこの E に対して定義されていないため、Eclipse ではへの呼び出しは受け入れられません。

代わりにこのコンストラクターを使用することは受け入れられますが、呼び出し元が値を提供する必要があります。

public MyClass(E[] e) {
    choices = e;
}

私が見つけたドキュメントで:

Java プログラミング言語の列挙型は、他の言語の対応するものよりもはるかに強力です。enum 宣言は、クラス (enum 型と呼ばれます) を定義します。enum クラス本体には、メソッドやその他のフィールドを含めることができます。コンパイラは、列挙型を作成するときに、いくつかの特別なメソッドを自動的に追加します。たとえば、宣言されている順序で列挙型のすべての値を含む配列を返す静的値メソッドがあります。

この問題を回避する方法はありますか?

4

2 に答える 2

22

あなたの最善の選択肢は、おそらくClass、目的の列挙型の a をコンストラクターに渡すことです。EnumMap(たとえば、 an がどのように構築されるかを参照してください。)

その後、定数を取得するために使用できます。clazz.getEnumConstants()

于 2012-07-26T06:52:47.733 に答える
3

Generics が Java でどのように実装されているか、および型消去として知られる現象が原因で、最初のコード スニペットが機能しません。Eこのため、JVM は、プログラムの実行時にのタイプが何であるかを認識できません。

MyClassおそらく、のコンストラクターで次のようなことができます。

public MyClass(E type) {
    choices = type.getDeclaringClass().getEnumConstants();
}
于 2012-07-26T06:58:22.883 に答える