该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间: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 |
|
返回顶楼 | |
发表时间: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进去。 但是这个问题背后的知识,确实要好好研究一下 |
|
返回顶楼 | |
发表时间:2012-02-01
mfkvfn 写道
看了一下发现如果能取到(我还没试呵呵),是他通过构造方法把T赋值过去,等于多加了一步奏。且子类需要继承父类,条框众多如“ 不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有: public class BookDao extends BaseHibernateEntityDao<Book> ” |
|
返回顶楼 | |
发表时间:2012-02-01
最后修改:2012-02-01
根据江南白衣的帖子,还有各位发的帖子,说穿了。
就是只有编译期确定下来的具体T类型才能获取到。 如: public class BookDao extends BaseHibernateEntityDao<Book> 如果我编译期不需要传入这个Book类型(而是把BookDao做成匿名类通过参数传递的方式传递到模板方法里),而把类型的获取转移到我的模板方法里面,就取不到了T的具体类型了 |
|
返回顶楼 | |
发表时间:2012-02-01
http://www.blogjava.net/calvin/archive/2006/04/28/43830.html 试了一下该方法,可以取到T了,但是我在权衡是否要把设计改造成他那个样子
|
|
返回顶楼 | |
发表时间:2012-02-01
什么版本,升级高点,hibernate已经有泛型api了,3.6试试
|
|
返回顶楼 | |
发表时间:2012-02-01
泛型是在编译后会擦除,运行时不带任何泛型信息
|
|
返回顶楼 | |
发表时间:2012-02-01
反正是娶不到,只能取到父类的泛型
|
|
返回顶楼 | |
发表时间:2012-02-01
peak 写道 反正是娶不到,只能取到父类的泛型
可以取得到,但是需要改造一下,详见 江南白衣那个文章 |
|
返回顶楼 | |
发表时间:2012-02-01
最后修改:2012-02-01
鼎鼎大名的“江南白衣”是SpringSide的作者,他从Hibernate中抄出的那个方法是可以的,很早以前就测试过了,确实可以,复杂是复杂了点,不过确实可用。
|
|
返回顶楼 | |