论坛首页 Java版 OO

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

浏览 613 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-07-02
最近参考网上的范型Dao自己写了一个。但是发现按照网上的说法,类居然无法实例化。
我专门把那部分代码提了出来,单独写了个小测试。
范型类
public class tmp<T> {
    
    private Class<T> eClass;
    
    public tmp() {
        super();
        eClass = (Class<T>)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
    }

    public Class<T> getEClass() {
        return eClass;
    }

    public void setEClass(Class<T> eClass) {
        this.eClass = eClass;
    }
}

Junit测试如下:
public class tmpTest {

    public tmpTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of getEClass method, of class tmp.
     */
    @Test
    public void testNewClass() {
        tmp<String> tmap = new tmp<String>();
        Class s = String.class;
        assertEquals(s,tmap.getEClass());
        fail("The test case is a prototype.");
    }

    

}

最后出现如下错误
Testcase: testNewClass(org.Miao.tmpTest):	Caused an ERROR
java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
        at org.Miao.tmp.<init>(tmp.java:21)
        at org.Miao.tmpTest.testNewClass(tmpTest.java:45)


Test org.Miao.tmpTest FAILED
test-report:
D:\nMiao\tmp\nbproject\build-impl.xml:540: Some tests failed; see details above.
生成失败(总时间:0 秒)




也就是说类根本无法实例化。是因为((ParameterizedType)(this.getClass().getGenericSuperclass())无法强转。我网上看了一下,几乎所有的范型Dao实现取范型类都是这么去的。真不知道我是哪里错了。
   
时间:2008-07-02
T是不存在的,获取不到
   
0 请登录后投票
时间:2008-07-02
又在论坛里反复搜寻了一下,发现还真是。除非用父类<范型> 引用 = 一个继承了已经范型好的父类的子类才可以得到。昏死,居然这么麻烦。
   
0 请登录后投票
时间:2008-07-02
必须继承才能获取到的
实际上泛型语法没有多大意义,而且一不小心就会出错,少用为好
   
0 请登录后投票
时间:2008-07-02
xly_971223 写道
必须继承才能获取到的
实际上泛型语法没有多大意义,而且一不小心就会出错,少用为好

是啊,T只不过是个类型参数,本身就是个符号而已。
如果要取得类型,可以参考springside的泛型DAO的实现啊。
   
0 请登录后投票
时间:2008-07-03
泛型DAO实现不难,不过如果在Spring里用不灵。
   
0 请登录后投票
时间:2008-07-03
yujianqiu 写道
泛型DAO实现不难,不过如果在Spring里用不灵。


SpringSide里的泛型DAO就是在Spring里的,没问题的,我就在用。

你看一下源码就知道一些细节上的问题了,反正是SpringSide里顺利解决了一些小问题,就能正常工作了。
   
0 请登录后投票
时间:2008-07-03

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

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

 

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

 

   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐