黑马程序员技术交流社区

标题: 泛型反射问题??? [打印本页]

作者: 李磊_Adam    时间: 2013-9-1 20:37
标题: 泛型反射问题???
本帖最后由 杨增坤 于 2013-9-3 11:03 编辑

复制代码
  1. public class GenericsDemo {
  2.         public static void main(String[] args) throws Exception {
  3.                 ArrayList<Integer> al1=new ArrayList<Integer>();
  4.                 ArrayList<String> al2=new ArrayList<String>();
  5.                 System.out.println(al1.getClass() == al2.getClass());  
  6.                
  7.                 al1.getClass().getMethod("add", Object.class).invoke(al1, "abc");
  8.                 System.out.println(al1.get(0));
  9.                
  10.                 al2.getClass().getMethod("add", Object.class).invoke(al2, 3);
  11.                 System.out.println(al2.get(0));
  12.         }
  13. }
复制代码
以上代码编译没有问题,运行结果如下,第三个打印出错是为什么呢?
运行结果:
true
abc
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        at day16.GenericsDemo.main(GenericsDemo.java:16)



作者: 范龙波    时间: 2013-9-1 21:31
al2.getClass().getMethod("add", Object.class).invoke(al2, 3);  //3自动转成Integer类型-->存入到List集合
所以会报这个类型转换异常"Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String"

作者: 李磊_Adam    时间: 2013-9-1 21:59
范龙波 发表于 2013-9-1 21:31
al2.getClass().getMethod("add", Object.class).invoke(al2, 3);  //3自动转成Integer类型-->存入到List集 ...

没明白怎么个意思啊? 泛型在编译后不是没有了吗,都是同一字节码文件,怎么一个(原来是Integer)可以反射存入(String),一个(原来是String)不能反射存入(Integer)呢?

作者: binghaiwang    时间: 2013-9-1 22:22
本帖最后由 binghaiwang 于 2013-9-1 23:06 编辑

刚才的解答有误了。
作者: 范龙波    时间: 2013-9-1 22:25
李磊_Adam 发表于 2013-9-1 21:59
没明白怎么个意思啊? 泛型在编译后不是没有了吗,都是同一字节码文件,怎么一个(原来是Integer)可以反 ...



作者: 李磊_Adam    时间: 2013-9-1 22:33
binghaiwang 发表于 2013-9-1 22:22
改成上述即可。原因一注明。

那System.out.pritln(al1.get(0)怎么可以打印出abc,al1怎么没有泛型约束?

作者: 兜兜转转    时间: 2013-9-2 05:55
李磊_Adam 发表于 2013-9-1 22:33
那System.out.pritln(al1.get(0)怎么可以打印出abc,al1怎么没有泛型约束?

我也觉得是,为什么能打印abc呢?




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