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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王雷1 中级黑马   /  2013-11-26 13:02  /  1264 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ArrayList<String> collection1 = new ArrayList<String>();
collection1.add("abc");
collection1.add("def");
Method add1 = collection1.getClass().getMethod("add", Object.class);
add1.invoke(collection1, 1);
System.out.println(collection1.get(2));
为什么这么写会报异常,不能够自动装箱吗?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

4 个回复

倒序浏览
会自动装箱,1会自动有一个Integer.valueOf(1)的操作,但是如果类型参数是String的话,通过反射把其他类型加进去会出现问题,能成功加进去,但是读取就会报错,类型参数为非String类型的话就不存在这个问题,我实验过,但是还是搞不明白为什么String类型参数的反射会出现这问题。或许有其什么特性把
回复 使用道具 举报
自动装箱是把int 型装成Integer但是不能把int型封装成String,自动装箱拆箱是指在基本类经和它的封装类之间进行的
回复 使用道具 举报
补充一下,我觉得这个问题应该先解释为什么编译没有报异常,因为反射使用的是字节码,而泛型只在编译器有效,编译后虚拟机会将泛型清除。所以通过反射可以将Int 型添加进去。但是你取出的时候不是通过反射,这时候有泛型信息。至于为什么没装箱,因为int型装箱装成Integer而不是String
回复 使用道具 举报
谢谢,我晚上回家实验一下,家里没有网只能网吧,所以啥都没有,回去我就实验,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马