我有一个问题,我需要解决替换泛型类型参数的类的类型。这是代码:
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
的
答案 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();
}
}