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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马__李龙   /  2012-8-17 19:15  /  3580 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

苑占丽 发表于 2012-8-17 21:08
我刚才也试了,一下,确实很诡异,按理第一个能出来,那么当泛型参数是String,Integer类型的应该也能出 ...

问题已解决
回复 使用道具 举报
朱云坤 发表于 2012-8-17 21:53
http://bbs.itheima.com/thread-13280-1-1.html   大家看下这个帖子就明白了。。。

感谢                              
回复 使用道具 举报
日记写完
总结发下
泛型是编译器类型擦除
在编译期间,当需要调用这个泛型类的方法时,编译期间编译器会在编写二进制文件即.class文件时用泛型类自身方法的二进制码,即进行一次强转(E) elementData[index],所以在调用时会有类型转换异常。而不需要调用方法时,执行的时候也只是按最原始(和非JDK1.5泛型的一样),没有类型转换,该怎么样怎么样,所以没有转换异常。另外在代码System.out.println(list.get(0));,根据实验发现,它会编译期间做判断,如果泛型类是String类型则不做类型转换直接输出,如果不是则认为是Object类型需要使用toString方法打印,其实原理是调用不同的方法一个为:println(Object x),另一个为:println(String x)。使用println(Object x)方法它并不是在编译期间调用泛型类的toString的二进制码,而在运行期间调用实际类自己的toString方法,有点类似于多态,以Object为父类,调用子类实际的方法;总结:泛型类如果不是String时,则编译时按照参数为Object的方法进行编译,然后运行期间多态调用子类的toString方法,正常执行;泛型类如果是String时,编译时按照参数为String的方法进行编译,然后运行期间直接打印,但是实际类型不是String,则抛出转换异常。以上仅为个人猜想,期待大家的交流。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马