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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁冬梅 黑马帝   /  2012-4-27 16:20  /  2234 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁冬梅 于 2012-4-27 20:25 编辑

张老师说泛型只是给编译器看的,通过反射可以避开泛型,也就是说带了泛型限定的集合只是傲娇于表面,其实,骨子里它还是神马都可以装。
于是我也兴致勃勃的跟着老师走一遍小代码,不过我高兴太早了!!!!!!!!!!看到运行结果我差点吐血✖_✖。
请看下面代码块,第一段是老师的结果正确,第二个是我走的,结果类型不匹配,OTZ,所以说,我这是怎样的RP啊!
后来我又试了试其它类型的泛型参数。都可以得到结果,只是改成String它就给我傲娇,编译给你通过,运行时给你报错 = =。

所以,大家帮我看看这是怎么回事吧?照老师的来说,应该是不会出现这样的问题的呀,挠头。。。
  1. ArrayList<Integer> al = new ArrayList<Integer>();
  2.           al.getClass().getMethod("add", Object.class).invoke(al, "abc");
  3.           System.out.println(al.get(0));
  4. //结果:abc
  5. ArrayList<String> al = new ArrayList<String>();
  6.           al.getClass().getMethod("add", Object.class).invoke(al, 69);
  7.           System.out.println(al.get(0));
  8. //报错:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
复制代码

6 个回复

倒序浏览
本帖最后由 刘少伟 于 2012-4-27 16:40 编辑

貌似看错题了- -,占位修改下

回复 使用道具 举报
你这个代码我看很久!
调试好了很多次!
发现把你的代码改成这样,就会有一样的错误了!
  1. ArrayList<Integer> al = new ArrayList<Integer>();
  2.                 al.getClass().getMethod("add", Object.class).invoke(al, new User());
  3.                 System.out.println(al.get(0).getClass());
复制代码
我想了想!只能说是可能!
因为在String类中有一个toString()函数,上次听老师说是当输出一个字符串的时候就会会自动执行的!可能是因为它自动执行在你取出来的时候自己去转换了一次。但是因为类型不对,所以就会报错。
这个我只是觉得可能是这样的。不然实在想不出什么原因了!
回复 使用道具 举报
本帖最后由 张卯 于 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!
回复 使用道具 举报
我刚写的,希望对你有帮助
http://bbs.itheima.com/thread-13280-1-1.html
回复 使用道具 举报
上面师兄说的很对,就是这个原因。
回复 使用道具 举报
袁冬梅 黑马帝 2012-4-27 20:10:51
7#
张卯 发表于 2012-4-27 18:07
首先,因为泛型只作用于编译时,而反射是直接获得add方法的字节码,跳过编译,直接在运行时添加。所以数据 ...

谢谢,好好理解了一下,的确是这样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马