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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 喝龙血的我 中级黑马   /  2013-10-9 20:06  /  1851 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 喝龙血的我 于 2013-10-10 08:09 编辑
  1. ArrayList<Integer> collection = new ArrayList<Integer>();
  2.   collection.add(1);
  3.   collection.add(2);
  4.   Method add = collection.getClass().getMethod("add", Object.class);
  5.   add.invoke(collection, "abc");
  6.   System.out.println(collection.get(2));
复制代码
上边是老师视屏中的代码
  1. ArrayList<String> collection1 = new ArrayList<String>();
  2.   collection1.add("abc");
  3.   collection1.add("def");
  4.   Method add1 = collection1.getClass().getMethod("add", Object.class);
  5.   add1.invoke(collection1, 1);
  6.   System.out.println(collection1.get(2));
复制代码
这个是我根据老师改的,只是换个了类型,为什么就不能运行了呢??报了异常



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 winsking 于 2013-10-10 11:42 编辑

System.out.println(collection1.get(2));报错,最后一句哦,不是invoke出错新帖地址:
http://bbs.itheima.com/forum.php?mod=viewthread&tid=87906&page=1&extra=#pid498545

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
winsking 发表于 2013-10-9 20:16
个人理解:
add1.invoke(collection1, 1);是不对的,基本数据类型是不能被添加进去的,应该改成
add1.invok ...

不能够自动装箱吗?
回复 使用道具 举报
本帖最后由 winsking 于 2013-10-10 11:43 编辑
喝龙血的我 发表于 2013-10-9 20:17
不能够自动装箱吗?

偶也在研究中...
回复 使用道具 举报
winsking 发表于 2013-10-9 20:34
自动装箱是很好,但是Java也没有这么智能吧,集合中不能添加基本数据类型,编译就通不过的
反射获取的方 ...

我测试了下  换成new  Integer(1) 依然报类型转换异常
回复 使用道具 举报
自动装箱: Integer i = 1;
相当于编译器自动做一下语法编译: Integer i  = new Integer(1);
但前提是你要声明为Object类型
你的add1.invoke(collection1,1);   api中后面的参数类型默认为Object,
而你这样写相当于是int i = 1;
而不是Integer i = 1;
所以无法自动装箱。运行会出现类型异常

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
黄绍楷 发表于 2013-10-9 21:18
自动装箱: Integer i = 1;
相当于编译器自动做一下语法编译: Integer i  = new Integer(1);
但前提是你 ...

那怎么让这段代码通过呢?把1换成  new Integer(1)还是报异常的啊
回复 使用道具 举报
额,因为你用了泛型,参数必须和前面的泛型类型一致,所以只要add1.invoke(collection1,"1"); 加个引号就行,如果是想试验不同类型转换,删除泛型就ok
回复 使用道具 举报
  1. ArrayList<Integer> array = new ArrayList<Integer>();

  2.                 // array.add("hello");

  3.                 Class c = array.getClass();
  4.                 Method m = c.getMethod("add", Object.class);

  5.                 m.invoke(array, "hello");
  6.                 m.invoke(array, "world");
  7.                 m.invoke(array, true);

  8.                 System.out.println(array);
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马