黑马程序员技术交流社区
标题:
【已解决】大家帮帮忙
[打印本页]
作者:
袁冬梅
时间:
2012-4-27 16:20
标题:
【已解决】大家帮帮忙
本帖最后由 袁冬梅 于 2012-4-27 20:25 编辑
张老师说泛型只是给编译器看的,通过反射可以避开泛型,也就是说带了泛型限定的集合只是傲娇于表面,其实,骨子里它还是神马都可以装。
于是我也兴致勃勃的跟着老师走一遍小代码,不过我高兴太早了!!!!!!!!!!看到运行结果我差点吐血✖_✖。
请看下面代码块,第一段是老师的结果正确,第二个是我走的,结果类型不匹配,OTZ,所以说,我这是怎样的RP啊!
后来我又试了试其它类型的泛型参数。都可以得到结果,只是改成String它就给我傲娇,编译给你通过,运行时给你报错 = =。
所以,大家帮我看看这是怎么回事吧?照老师的来说,应该是不会出现这样的问题的呀,挠头。。。
ArrayList<Integer> al = new ArrayList<Integer>();
al.getClass().getMethod("add", Object.class).invoke(al, "abc");
System.out.println(al.get(0));
//结果:abc
ArrayList<String> al = new ArrayList<String>();
al.getClass().getMethod("add", Object.class).invoke(al, 69);
System.out.println(al.get(0));
//报错:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
复制代码
作者:
刘少伟
时间:
2012-4-27 16:37
本帖最后由 刘少伟 于 2012-4-27 16:40 编辑
貌似看错题了- -,占位修改下
作者:
杨志
时间:
2012-4-27 17:41
你这个代码我看很久!
调试好了很多次!
发现把你的代码改成这样,就会有一样的错误了!
ArrayList<Integer> al = new ArrayList<Integer>();
al.getClass().getMethod("add", Object.class).invoke(al, new User());
System.out.println(al.get(0).getClass());
复制代码
我想了想!只能说是可能!
因为在String类中有一个toString()函数,上次听老师说是当输出一个字符串的时候就会会自动执行的!可能是因为它自动执行在你取出来的时候自己去转换了一次。但是因为类型不对,所以就会报错。
这个我只是觉得可能是这样的。不然实在想不出什么原因了!
作者:
张卯
时间:
2012-4-27 18:07
本帖最后由 张卯 于 2012-4-27 18:31 编辑
首先,因为泛型只作用于编译时,而反射是直接获得add方法的字节码,跳过编译,直接在运行时添加。所以数据其实已经顺利存进去了,你仔细看下错误提示(错误是运行时发生的),可以发现提示出错的地方其实是输出语句,ArrayList<Integer>执行System.out.println(al.get(0));时是内部调用了String.valueOf(obj)方法,所以没问题,改为ArrayList<String>执行输出语句时,由于ArrayList指定的是String类型,它便直接输出了,而数据是Integer类型的,不能转成String,所以报错。
可以把System.out.println(al.get(0)); 改为
Object obj=al.get(0);
System.out.println(obj);搞定,ok!
作者:
施俊
时间:
2012-4-27 19:27
我刚写的,希望对你有帮助
http://bbs.itheima.com/thread-13280-1-1.html
作者:
一生一世
时间:
2012-4-27 19:32
上面师兄说的很对,就是这个原因。
作者:
袁冬梅
时间:
2012-4-27 20:10
张卯 发表于 2012-4-27 18:07
首先,因为泛型只作用于编译时,而反射是直接获得add方法的字节码,跳过编译,直接在运行时添加。所以数据 ...
谢谢,好好理解了一下,的确是这样的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2