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 中声明的 Enum

4

3 回答 3

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 回答
1

我认为这是不可能的,因为类型擦除会删除类型信息。一些链接:

于 2012-04-19T14:01:33.817 回答
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 回答