2012-04-19 59 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