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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李磊_Adam 中级黑马   /  2013-9-1 20:37  /  1614 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 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)


评分

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

查看全部评分

6 个回复

倒序浏览
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"

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
范龙波 发表于 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 23:06 编辑

刚才的解答有误了。
回复 使用道具 举报
李磊_Adam 发表于 2013-9-1 21:59
没明白怎么个意思啊? 泛型在编译后不是没有了吗,都是同一字节码文件,怎么一个(原来是Integer)可以反 ...


回复 使用道具 举报
binghaiwang 发表于 2013-9-1 22:22
改成上述即可。原因一注明。

那System.out.pritln(al1.get(0)怎么可以打印出abc,al1怎么没有泛型约束?
回复 使用道具 举报
李磊_Adam 发表于 2013-9-1 22:33
那System.out.pritln(al1.get(0)怎么可以打印出abc,al1怎么没有泛型约束?

我也觉得是,为什么能打印abc呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马