0

汎用Javaクラス内から任意の列挙型のプロパティにアクセスしようとしています。特に、列挙型の値の数と実際の値自体にアクセスしたいと思います。

この(明らかにばかげた)ダミーコードは、その意図を示しています。

public class Test <E extends Enum>{
    public enum TestEnum {
        FIRST, SECOND, THIRD
    }
    public Test() {
        System.out.println(E.values().length);   //error - won't compile
    }
    public static void main(String[] args) {
        Test<TestEnum> t = new Test<TestEnum>();
    }
}

StackOverflowには同様の問題に対する解決策がいくつかありますが、列挙型を変更する必要があります。ここで重要なのは、コードが任意の列挙型に対して機能することです。

これはJavaでも可能ですか?

アドバイスをよろしくお願いします。

〜クリス

4

2 に答える 2

3

列挙型を作成するときにコンパイラが自動的に追加するリフレクションと静的値メソッドを使用できます。

public class Test {

    public enum TestEnum {
        FIRST, SECOND, THIRD
    }

    public Test(Class<? extends Enum> enumType) throws IllegalAccessException,
            InstantiationException, NoSuchMethodException,
            InvocationTargetException {
        Enum[] values = (Enum[]) enumType.getDeclaredMethod("values").invoke(
            null);
        System.out.println(Arrays.toString(values));
    }

    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {
        Test t = new Test(Test.TestEnum.class);
    }
}


>> [FIRST, SECOND, THIRD]
于 2013-02-09T04:02:54.717 に答える
0

実行時に E の実際のクラスにアクセスするには、コンパイル時に明示的に設定する必要があります。

Java 型消去の場合、型パラメーターとして設定しても機能しません。Test クラスをコンパイルし、javap を実行しました。

...
public static void main(java.lang.String[]);
  Code:
   0:   new #2; //class Test
   3:   dup
   4:   invokespecial   #3; //call no-arg constructor "<init>":()V
   7:   astore_1            // store object reference to local variable 't'
   8:   return

したがって、コンストラクターは TestEnum 型パラメーターについて何も知りません。

@stampy88が書いたように、クラスパラメータをコンストラクタに渡すのが最適な解決策です。

于 2013-02-09T05:58:30.513 に答える