2

問題があります。ジェネリック型パラメーターを置き換えたクラスの型を解決する必要があります。コードは次のとおりです。

public class EnumSetPlay {

    private enum SomeEnum {ONE, TWO}

    private static class Test<E extends Enum> {
        private Class<E> clazz = (Class<E>) GenericTypeResolver.resolveTypeArgument(getClass(), Test.class);;

        public void test() {
            for (E element : EnumSet.allOf(clazz))
                System.out.println(element);
        }
    }

    public static void main(String... args) {
        new Test<SomeEnum>().test();
    }
}

クラスタイプSomeEnumを取得する必要があります。Spring GenericTypeResolverクラスを使用しようとしていますが、次のエラーが発生します。

エラー:互換性のないタイプ
必須:E
見つかった:オブジェクト
ここで、Eは型変数です。
EはクラスTestで宣言された列挙型を拡張します

4

3 に答える 3

1

型情報が削除される型消去のため、これは不可能だと思います。いくつかのリンク:

于 2012-04-19T14:01:33.817 に答える
1

これを試して:

    public class EnumSetPlay {

    private enum SomeEnum {
        ONE, TWO
    }

    private static class Test<E extends Enum<E>> {

        @SuppressWarnings("unchecked")
        private Class<E> clazz = (Class<E>) GenericTypeResolver.resolveTypeArgument(getClass(), Test.class); ;

        public void test() {
            for (E element : EnumSet.allOf(clazz))
                System.out.println(element);
        }
    }

    private static class DummyTest extends Test<SomeEnum> {
    }

    public static void main(String... args) {
        new DummyTest().test();
    }

}
于 2014-03-10T17:52:39.167 に答える
0

他の回答で説明されているように、型消去のために、あなたがやろうとしていることは単純に不可能です。やろうとしていることを達成する場合、唯一の解決策は、コンストラクターのパラメーターとしてクラスを渡すことです。

public class EnumSetPlay {

    private enum SomeEnum {ONE, TWO}

    private static class Test<E extends Enum<E>> {
        private Class<E> clazz ;

        public Test(Class<E> clazz) {
            this.clazz = clazz;
        }

        public void test() {
            for (E element : EnumSet.allOf(clazz))
                System.out.println(element);
        }
    }

    public static void main(String... args) {
        new Test<SomeEnum>().test();
    }
}
于 2012-04-19T17:27:22.697 に答える