如何从泛型获取类类型信息?

时间:2012-04-19 13:55:43

标签: java generics

我有一个问题,我需要解决替换泛型类型参数的类的类型。这是代码:

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类,但我有下一个错误:

error: incompatible types
required: E
found:    Object
where E is a type-variable:
E extends Enum declared in class Test

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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();
    }

}

答案 2 :(得分: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();
    }
}