2012-04-19 134 views
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。 我试图用簧GenericTypeResolver类,但我有一个错误:

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

+0

它通常是更好地与输入' >' – 2012-04-19 14:06:24

+0

我修复,但现在我有NullPointerException,因为clazz是null。 – user1289877 2012-04-19 14:29:45

回答

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(); 
    } 
} 
+0

是的,我有这个解决方案,但它似乎是不必要的重复,所以我想使它更简单。 – user1289877 2012-04-20 06:55:48

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(); 
    } 

} 
+0

这与所要求的不同 – newacct 2014-03-13 02:09:35