论坛首页 入门技术论坛

为什么运行时取不到泛型T,难道你们觉得没必要吗

浏览 15113 次
该帖已经被评为新手帖
作者 正文
   发表时间:2012-02-01  
laolinshi 写道
icezx 写道
laolinshi 写道
vcok 写道
在编译期间T被搞成Object,类型丢失,所以是不能直接取到的.但有时可以变通地取到,比如: 

public class GenericType<T> {
    protected GenericType() {
        Type superclass = getClass().getGenericSuperclass();        if (!(superclass instanceof ParameterizedType)) {
            throw new RuntimeException("Missing type parameter.");
        }
        ParameterizedType parameterized = (ParameterizedType) superclass;
       
        Class<T> messageType = parameterized.getActualTypeArguments()[0];
    }

一般人俺不告诉他

把红色的改成如下:Type superInterface=getClass().getGenericInterfaces()试试,应该就可以吧。


兄弟不行的,这根interfaces有啥关系呢。

你不是定义一个MybatisCallBack<T>的接口吗,你的实现类实现了这个接口的话,上面的方法就可以取到这个T的实际类型。


此处我要获取的是callback的泛型T。callback.getClass().getTypeParameters();取出来的数组长度为0
0 请登录后投票
   发表时间:2012-02-01  
gtssgtss 写道
icezx 写道
我想正如 http://www.iteye.com/topic/585900  这篇文章里提到的

如果这么做
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add("");

该如何在运行时获取Object的类型

用List<Object> list = new ArrayList<Object>(){};就可以取了,不过与其用如此晦涩的方法,还不如直接传一个Class


我刚才也想了一下,与其给这么多晦涩的api影响性能,不如直接传一个classtype进去。
但是这个问题背后的知识,确实要好好研究一下
0 请登录后投票
   发表时间:2012-02-01  
mfkvfn 写道


看了一下发现如果能取到(我还没试呵呵),是他通过构造方法把T赋值过去,等于多加了一步奏。且子类需要继承父类,条框众多如“
不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:
    public class BookDao extends BaseHibernateEntityDao<Book>



0 请登录后投票
   发表时间:2012-02-01   最后修改:2012-02-01
根据江南白衣的帖子,还有各位发的帖子,说穿了。
就是只有编译期确定下来的具体T类型才能获取到。
如:
  public class BookDao extends BaseHibernateEntityDao<Book>

如果我编译期不需要传入这个Book类型(而是把BookDao做成匿名类通过参数传递的方式传递到模板方法里),而把类型的获取转移到我的模板方法里面,就取不到了T的具体类型了
0 请登录后投票
   发表时间:2012-02-01  
http://www.blogjava.net/calvin/archive/2006/04/28/43830.html 试了一下该方法,可以取到T了,但是我在权衡是否要把设计改造成他那个样子
0 请登录后投票
   发表时间:2012-02-01  
什么版本,升级高点,hibernate已经有泛型api了,3.6试试
0 请登录后投票
   发表时间:2012-02-01  
泛型是在编译后会擦除,运行时不带任何泛型信息
0 请登录后投票
   发表时间:2012-02-01  
反正是娶不到,只能取到父类的泛型
0 请登录后投票
   发表时间:2012-02-01  
peak 写道
反正是娶不到,只能取到父类的泛型

可以取得到,但是需要改造一下,详见 江南白衣那个文章
0 请登录后投票
   发表时间:2012-02-01   最后修改:2012-02-01
鼎鼎大名的“江南白衣”是SpringSide的作者,他从Hibernate中抄出的那个方法是可以的,很早以前就测试过了,确实可以,复杂是复杂了点,不过确实可用。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics