锁定老帖子 主题:提问:Java5泛型的T.class的获取
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-01
bencode 写道 嗯, JAVA的泛形实现采用的是"擦除法",意味着编译后,其实T根本不存在.
.
所以楼主的泛形代码,基本上和下面这段等效" public class BaseHelper { private Object object = null; private HttpServletRequest request; public BaseHelper(HttpServletRequest request, String key) { this.request = request; object = request.getSession().getAttribute(key); if(object == null){ //怎样获取T.class? // T在哪里? 嘿嘿 } } public T get(){ return object; } } 只不过是在编码时,方便一些. 所以根据形别参数是构造不出具体的对象的. 对 编译后的class文件中是没有T的,所有用这个这种方式是取不到T.class的 ruby等动态语言是不是能够解决这个问题呢? |
|
返回顶楼 | |
发表时间:2007-02-03
江南白衣 写道 Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 真是太绝了,我在没看到这个帖之前,也一直想着这个问题。 因为我想让每个Dao只处理一个Entity, 怎样将该Dao所处理Entity的class元数据传到BaseDao一直没想到好办法, 俗套的办法只好用构造函数传入 BaseDao(Class<T> entityClass) 或使用模板方法模式 abstract Class<T> getEntityClass(); 看了上面的实现,看来是自己对反射没学好。 |
|
返回顶楼 | |
发表时间:2007-02-03
引用 xly_971223说
对 编译后的class文件中是没有T的,所有用这个这种方式是取不到T.class的 ruby等动态语言是不是能够解决这个问题呢? Ruby根本不存在这种问题. |
|
返回顶楼 | |
发表时间:2007-03-14
引用 public class BaseHelper<T> { public BaseHelper() {} } BaseHelper<Customer> bh = new BaseHelper<Customer>(); 各位的意思就是说 如上一段代码是没办法知道T的运行时真实类型了? 刚找了半天也没发现怎么样可以在我上面的代码所示的情况下 ,得到 T.class 如果这样,是不是泛型在设计上有点奇怪呢? 按照我的理解,信息一旦体现在实例初始化了,就应该能够取到才合理,希望得到一些指点哦。 |
|
返回顶楼 | |
发表时间:2007-03-18
如上代码,编译期检查而已,运行期已没有T的概念,所以T.class是得不到的,这和大部分的逻辑是不相符合的,java的一个奇怪的语法吧
|
|
返回顶楼 | |
发表时间:2007-04-06
是不是可以这样理解:泛型像C里面的宏一样,根本就不是Java语言本身的东西,仅仅是为java增加编译检查手段而已,Java的类加载运行时,根本就没有泛型的概念,更不用说动态获取T.class了
|
|
返回顶楼 | |
发表时间:2007-04-06
关注,我也想过这个问题,一直没有好的解决办法。
|
|
返回顶楼 | |
发表时间:2007-04-06
java对这个问题的解决,就现在看来似乎是无能为力
|
|
返回顶楼 | |
发表时间:2007-04-07
xly_971223 写道 需求:
现在想用jdk5的范型将上面的3个类合并成一个 如下: public class BaseHelper<T> { private T object = null; private HttpServletRequest request; public BaseHelper(HttpServletRequest request, String key) { this.request = request; object = (T)request.getSession().getAttribute(key); if(object == null){ //怎样获取T.class? } } public T get(){ return object; } } 问题: 怎样获取T.class? 在http://www.blogjava.net/calvin/archive/2006/04/28/43830.html中有介绍获取T.class的方法,但是要求先写一个父类,然后通过继承来实现 这样做需要4个类才能实现:一个父类和3个子类 请问高手们 能不能通过一个类或者有限个类来就解决这类问题? ---------------------------------------------------------------- T.class是无法获取了,这里提供一个稍微"变态"一点的办法: public class BaseHelper<T> { private T object = null; private HttpServletRequest request; public BaseHelper(HttpServletRequest request, String key, Class<T> clazz) { this.request = request; object = (T)request.getSession().getAttribute(key); if(object == null){ object = clazz.newInstance(); } } public T get(){ return object; } } 当然,这样用的前题是你的类里面要有一个无参数的构造函数. 如果你需要参数化你的构造类,那么可以把参数也传进去,如你有一个带4个String类型参数的构造函数,那么你可以这样定义: public class BaseHelper<T> { private T object = null; private HttpServletRequest request; public BaseHelper(HttpServletRequest request, String key, Class<T> clazz, String... param) { this.request = request; object = (T)request.getSession().getAttribute(key); if(object == null){ //初始化 object } } public T get(){ return object; } } |
|
返回顶楼 | |
发表时间:2007-04-07
关注中,唉,看看强人的代码,才知道自己有多烂
|
|
返回顶楼 | |