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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 반야_바라_밀 中级黑马   /  2014-8-10 19:38  /  1307 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

首先:由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据。
现在我定义两个泛型的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, 下载次数: 28)

QQ截图20140810193632.png

9 个回复

倒序浏览
大哥collection2是字符串
回复 使用道具 举报
怎么add的怎么get……
collection2.getClass().getMethod("get", int.class).invoke(collection2, 0);
               
回复 使用道具 举报
pengyu1801 发表于 2014-8-10 19:48
大哥collection2是字符串

编译生成的字节码会去掉泛型的类型信息,所以编译后便忽略了它的类型信息。
回复 使用道具 举报
你的add方法接收的是Objectl类型   int不是Object类型
回复 使用道具 举报
mr.yang 发表于 2014-8-10 20:15
你的add方法接收的是Objectl类型   int不是Object类型

那为什么collection3能够执行成功呢?
回复 使用道具 举报
반야_바라_밀 发表于 2014-8-10 20:17
那为什么collection3能够执行成功呢?

应该是自动装箱
回复 使用道具 举报
collection3泛型是Integer,collection2的泛型是String.
回复 使用道具 举报
icris 中级黑马 2014-8-10 20:23:22
9#
这是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.
复制代码

回复 使用道具 举报
반야_바라_밀 发表于 2014-8-10 20:11
编译生成的字节码会去掉泛型的类型信息,所以编译后便忽略了它的类型信息。 ...

不是所有的信息都被擦除的。get方法的return语句是这样的:
return (E) elementData[index];
这里的(E)就不会被擦除,而是根据你给的实际类型参数进行强制类型转换。Integer当然没法强转为String
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马