黑马程序员技术交流社区

标题: 为什么这么写报异常? [打印本页]

作者: 王雷1    时间: 2013-11-26 13:02
标题: 为什么这么写报异常?
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));
为什么这么写会报异常,不能够自动装箱吗?

作者: freehiker    时间: 2013-11-26 13:25
会自动装箱,1会自动有一个Integer.valueOf(1)的操作,但是如果类型参数是String的话,通过反射把其他类型加进去会出现问题,能成功加进去,但是读取就会报错,类型参数为非String类型的话就不存在这个问题,我实验过,但是还是搞不明白为什么String类型参数的反射会出现这问题。或许有其什么特性把
作者: 一直很安静    时间: 2013-11-26 13:38
自动装箱是把int 型装成Integer但是不能把int型封装成String,自动装箱拆箱是指在基本类经和它的封装类之间进行的
作者: 一直很安静    时间: 2013-11-26 14:05
补充一下,我觉得这个问题应该先解释为什么编译没有报异常,因为反射使用的是字节码,而泛型只在编译器有效,编译后虚拟机会将泛型清除。所以通过反射可以将Int 型添加进去。但是你取出的时候不是通过反射,这时候有泛型信息。至于为什么没装箱,因为int型装箱装成Integer而不是String

作者: 王雷1    时间: 2013-11-26 14:14
谢谢,我晚上回家实验一下,家里没有网只能网吧,所以啥都没有,回去我就实验,谢谢




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