黑马程序员技术交流社区

标题: 关于泛型擦除 [打印本页]

作者: 风乐    时间: 2013-7-13 22:03
标题: 关于泛型擦除
本帖最后由 风乐 于 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>
复制代码


作者: 王靖远    时间: 2013-7-13 22:09
操作带泛型对象的方法会有记下所操作对象的类型参数。
作者: 风乐    时间: 2013-7-13 22:23
王靖远 发表于 2013-7-13 22:09
操作带泛型对象的方法会有记下所操作对象的类型参数。

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

我来答,字节码里面有方法的信息,方法的信息里面包含其参数的信息,这个参数的信息里面有泛型信息
作者: 风乐    时间: 2013-7-13 22:33
chslzj 发表于 2013-7-13 22:28
我来答,字节码里面有方法的信息,方法的信息里面包含其参数的信息,这个参数的信息里面有泛型信息 ...

哦,我一直以为泛型擦除就是泛型信息都给抹消掉了。只是失去了限定的效力,但信息还在,是这样吧。谢谢解答哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2