黑马程序员技术交流社区

标题: 一个关于泛型的问题? [打印本页]

作者: 반야_바라_밀    时间: 2014-8-10 19:38
标题: 一个关于泛型的问题?
首先:由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据。
现在我定义两个泛型的ArrayList:ArrayList<String> collection2=new ArrayList<String>();
                              ArrayList<Integer> collection3=new ArrayList<Integer>();
对collection2执行以下语句:
                  collection2.getClass().getMethod("add", Object.class).invoke(collection2,12);
                               System.out.println(collection2.get(0));
对collection3执行以下语句:
                  collection3.getClass().getMethod("add", Object.class).invoke(collection3,12);
                               System.out.println(collection3.get(0));
问题来了:为什么collection3执行时能够输出12,但collection2执行时却会报错呢?

QQ截图20140810193632.png (3.58 KB, 下载次数: 29)

QQ截图20140810193632.png

作者: pengyu1801    时间: 2014-8-10 19:48
大哥collection2是字符串
作者: icris    时间: 2014-8-10 19:56
怎么add的怎么get……
collection2.getClass().getMethod("get", int.class).invoke(collection2, 0);
               
作者: 반야_바라_밀    时间: 2014-8-10 20:11
pengyu1801 发表于 2014-8-10 19:48
大哥collection2是字符串

编译生成的字节码会去掉泛型的类型信息,所以编译后便忽略了它的类型信息。
作者: mr.yang    时间: 2014-8-10 20:15
你的add方法接收的是Objectl类型   int不是Object类型
作者: 반야_바라_밀    时间: 2014-8-10 20:17
mr.yang 发表于 2014-8-10 20:15
你的add方法接收的是Objectl类型   int不是Object类型

那为什么collection3能够执行成功呢?
作者: mr.yang    时间: 2014-8-10 20:20
반야_바라_밀 发表于 2014-8-10 20:17
那为什么collection3能够执行成功呢?

应该是自动装箱

作者: pengyu1801    时间: 2014-8-10 20:22
collection3泛型是Integer,collection2的泛型是String.
作者: icris    时间: 2014-8-10 20:23
这是System.out.println(collection2.get(0));调用的println
  1. Open Declaration void java.io.PrintStream.println(String x)


  2. Prints a String and then terminate the line. This method behaves as though it invokes print(String) and then println().

  3. Parameters:
  4. x The String to be printed.
复制代码

这是System.out.println(collection2.getClass().getMethod("get", int.class).invoke(collection2, 0)); 调用的println
  1. Open Declaration void java.io.PrintStream.println(Object x)


  2. Prints an Object and then terminate the line. This method calls at first String.valueOf(x) to get the printed object's string value, then behaves as though it invokes print(String) and then println().

  3. Parameters:
  4. x The Object to be printed.
复制代码


作者: fantacyleo    时间: 2014-8-10 21:08
반야_바라_밀 发表于 2014-8-10 20:11
编译生成的字节码会去掉泛型的类型信息,所以编译后便忽略了它的类型信息。 ...

不是所有的信息都被擦除的。get方法的return语句是这样的:
return (E) elementData[index];
这里的(E)就不会被擦除,而是根据你给的实际类型参数进行强制类型转换。Integer当然没法强转为String




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