分享

在使用范型的时候如何获得类<T>中的这个T的类型呢?

 CevenCheng 2012-04-29
在使用范型的时候如何获得类<T>中的这个T的类型呢?
最近参考网上的范型Dao自己写了一个。但是发现按照网上的说法,类居然无法实例化。 
我专门把那部分代码提了出来,单独写了个小测试。 
范型类 
Java代码  收藏代码
  1. public class tmp<T> {  
  2.       
  3.     private Class<T> eClass;  
  4.       
  5.     public tmp() {  
  6.         super();  
  7.         eClass = (Class<T>)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];  
  8.     }  
  9.   
  10.     public Class<T> getEClass() {  
  11.         return eClass;  
  12.     }  
  13.   
  14.     public void setEClass(Class<T> eClass) {  
  15.         this.eClass = eClass;  
  16.     }  
  17. }  

Junit测试如下: 
Java代码  收藏代码
  1. public class tmpTest {  
  2.   
  3.     public tmpTest() {  
  4.     }  
  5.   
  6.     @BeforeClass  
  7.     public static void setUpClass() throws Exception {  
  8.     }  
  9.   
  10.     @AfterClass  
  11.     public static void tearDownClass() throws Exception {  
  12.     }  
  13.   
  14.     @Before  
  15.     public void setUp() {  
  16.     }  
  17.   
  18.     @After  
  19.     public void tearDown() {  
  20.     }  
  21.   
  22.     /** 
  23.      * Test of getEClass method, of class tmp. 
  24.      */  
  25.     @Test  
  26.     public void testNewClass() {  
  27.         tmp<String> tmap = new tmp<String>();  
  28.         Class s = String.class;  
  29.         assertEquals(s,tmap.getEClass());  
  30.         fail("The test case is a prototype.");  
  31.     }  
  32.   
  33.       
  34.   
  35. }  

最后出现如下错误 
Java代码  收藏代码
  1. Testcase: testNewClass(org.Miao.tmpTest):   Caused an ERROR  
  2. java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType  
  3. java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType  
  4.         at org.Miao.tmp.<init>(tmp.java:21)  
  5.         at org.Miao.tmpTest.testNewClass(tmpTest.java:45)  
  6.   
  7.   
  8. Test org.Miao.tmpTest FAILED  
  9. test-report:  
  10. D:\nMiao\tmp\nbproject\build-impl.xml:540: Some tests failed; see details above.  
  11. 生成失败(总时间:0 秒)  


也就是说类根本无法实例化。是因为((ParameterizedType)(this.getClass().getGenericSuperclass())无法强转。我网上看了一下,几乎所有的范型Dao实现取范型类都是这么去的。真不知道我是哪里错了。

===========================================================================================
又在论坛里反复搜寻了一下,发现还真是。除非用父类<范型> 引用 = 一个继承了已经范型好的父类的子类才可以得到。昏死,居然这么麻烦。

# public tmp() { 
# super(); 
# eClass = (Class<T>)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]; 
# } 

看到红色这块的代码就差不多明白了。。
始终需要一个具体的子类,上面的代码才能达到目的

 

TmpChild extends Tmp<XXX> 这里的XXX是一个具体的类,不是范型。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约