A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风乐 中级黑马   /  2013-7-13 22:03  /  1582 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 风乐 于 2013-7-13 22:49 编辑

擦除是在编译阶段将泛型类型以其父类代替,如String 变成了Object等,也就是说class文件中应该不包含String这个泛型信息了,那么为什么使用反射又可以得到这个泛型信息呢,代码如下
  1. <font color="#333333">package demo;

  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5. import java.util.Collection;
  6. import java.util.Iterator;

  7. public class Try {
  8.         public static void main(String[] args) throws Exception {
  9.                 Method method = Class.forName("demo.Ha").getMethod(
  10.                                 "show1", Collection.class);
  11.                 Type[] types = method.getGenericParameterTypes();
  12.                 for (Type type : types) {
  13.                         System.out.println(type);
  14.                         // ParameterizedType 表示参数化类型,如Collection<String>
  15.                         ParameterizedType pType = (ParameterizedType) type;
  16.                         // interface java.util.Collection
  17.                         System.out.println(pType.getRawType());
  18.                         // class java.lang.String   </font><font color="#ff0000">这里为什么会拿到这个结果</font><font color="#333333">
  19.                         System.out.println(pType.getActualTypeArguments()[0]);
  20.                 }
  21.         }
  22. }

  23. class Ha {

  24.         public static void show1(Collection<String> coll) {
  25.                 for (Iterator<String> iterator = coll.iterator(); iterator.hasNext();) {
  26.                         String str = iterator.next();
  27.                         System.out.println(str);

  28.                 }
  29.         }
  30. }</font>
复制代码

评分

参与人数 1技术分 +1 收起 理由
张勇1993 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
操作带泛型对象的方法会有记下所操作对象的类型参数。
回复 使用道具 举报
王靖远 发表于 2013-7-13 22:09
操作带泛型对象的方法会有记下所操作对象的类型参数。

那个方法是通过反射得到的,也就是说是从字节码文件中取到的,此时不是已经泛型擦除过了?你的意思是说,泛型信息还在,只是不再起限定作用了?
回复 使用道具 举报
这个,张老师的视频里面讲的很清楚的啊,一般得不到,但是,有需要的话,可以通过带泛型的参数的方法来得到信息,看视频不认真了吧
回复 使用道具 举报
风乐 发表于 2013-7-13 22:23
那个方法是通过反射得到的,也就是说是从字节码文件中取到的,此时不是已经泛型擦除过了?你的意思是说, ...

我来答,字节码里面有方法的信息,方法的信息里面包含其参数的信息,这个参数的信息里面有泛型信息
回复 使用道具 举报
chslzj 发表于 2013-7-13 22:28
我来答,字节码里面有方法的信息,方法的信息里面包含其参数的信息,这个参数的信息里面有泛型信息 ...

哦,我一直以为泛型擦除就是泛型信息都给抹消掉了。只是失去了限定的效力,但信息还在,是这样吧。谢谢解答哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马