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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘张朋 于 2013-8-18 15:02 编辑

在学到通过反射获取结合的add方法,可绕过泛型的限制的,张老师用下面的方式成功绕过了你泛型
ArrayList<Integer> collections1 = new ArrayList<Integer>();
collections1.getClass().getMethod("add",Object.class).invoke(collections1,"aaa");
System.out.println(collections.get(0));//可获得正确的输出

但是我在练习的时候,有意把泛型Integer换成了String
ArrayList<String> collections2 = new ArrayList<String>();
collections2.getClass().getMethod("add",Object.class).invoke(collections2,111);
System.out.println(collections2.get(0));//在取出的时候就发生了异常
但是如果用反射的方式得到get方法并运行的话是正常的
collections2.getClass().getMethod("get", int.class).invoke(collections2, 0);

我想问的是为什么将String类型的对象通过反射添加到实际类型为Integer的集合中后能直接通过get方法取出,
但是将Integer类型的对象通过反射添加到实际类型为String的集合中后不能直接用get方法取出呢?

评分

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

查看全部评分

7 个回复

倒序浏览
以前遇到过
关键在这两句话:
System.out.println(collections1.get(0));//编译器根据参数化类型的实际参数类型:Integer->调printStream类的void println(Object x)
                                                        //get(0)返回的结果相当于Object obj="aaa"-->传入obj-->没有问题
System.out.println(collections2.get(0));//编译器根据参数化类型的实际参数类型:String->调用printStream类的void println(String x)
                                                        //get(0)返回的结果相当于Object obj=111-->传入obj->String这时候需要强制向下转型
                                                      //->相当于(String)new Integer(111)-->ClassCastException
最好的办法:断点调试
具体可以参考:http://bbs.itheima.com/forum.php?mod=viewthread&tid=58162 张歆明同学回答!
                           

点评

又见大神,哈哈~~~  发表于 2013-8-17 23:56

评分

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

查看全部评分

回复 使用道具 举报
刘张朋 来自手机 中级黑马 2013-8-17 21:46:57
藤椅
有道理哈,报的错是Integer不能转换成String,刚试了一下把单独把collections2.get(0);拿出来直接运行就没问题了,
谢谢啦!
回复 使用道具 举报
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射才能获取。
回复 使用道具 举报
刘张朋 来自手机 中级黑马 2013-8-17 22:30:45
报纸
许云龙 发表于 2013-8-17 22:14
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射 ...

对呀,还是我的输出语句没学好呀,呵呵
回复 使用道具 举报
刘张朋 来自手机 中级黑马 2013-8-17 22:30:54
地板
许云龙 发表于 2013-8-17 22:14
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射 ...

对呀,还是我的输出语句没学好呀,呵呵
回复 使用道具 举报
张洪慊 发表于 2013-8-17 21:05
以前遇到过
关键在这两句话:
System.out.println(collections1.get(0));//编译器根据参数化类型的实际参数 ...

啥时候来北京啊 好久没联系了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马