黑马程序员技术交流社区

标题: 关于集合的方法通过反射绕过泛型的问题 [打印本页]

作者: 刘张朋    时间: 2013-8-17 19:16
标题: 关于集合的方法通过反射绕过泛型的问题
本帖最后由 刘张朋 于 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方法取出呢?


作者: 张洪慊    时间: 2013-8-17 21:05
以前遇到过
关键在这两句话:
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 21:46
有道理哈,报的错是Integer不能转换成String,刚试了一下把单独把collections2.get(0);拿出来直接运行就没问题了,
谢谢啦!
作者: 许云龙    时间: 2013-8-17 22:14
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射才能获取。
作者: 刘张朋    时间: 2013-8-17 22:30
许云龙 发表于 2013-8-17 22:14
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射 ...

对呀,还是我的输出语句没学好呀,呵呵
作者: 刘张朋    时间: 2013-8-17 22:30
许云龙 发表于 2013-8-17 22:14
我也试了一下,不光是Integer可以正常获取,八中基本类型封装类都可以正常获取,引用数据类型必须通过反射 ...

对呀,还是我的输出语句没学好呀,呵呵
作者: 张歆明    时间: 2013-10-17 12:23
张洪慊 发表于 2013-8-17 21:05
以前遇到过
关键在这两句话:
System.out.println(collections1.get(0));//编译器根据参数化类型的实际参数 ...

啥时候来北京啊 好久没联系了




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