黑马程序员技术交流社区

标题: 泛型的bug么?解释满意会送去申请加分哦! [打印本页]

作者: 笑脸迷人    时间: 2014-8-30 19:11
标题: 泛型的bug么?解释满意会送去申请加分哦!
本帖最后由 笑脸迷人 于 2014-8-30 19:25 编辑

请看代码:求解释代码中11行的注释,以及19行的异常的发生(貌似11行代码注释给了解释,但11为什么不报错~)
  1. import java.util.ArrayList;
  2. public class GenericDemo {
  3.         public static void main(String[] args)
  4.         {
  5.         ArrayList<Integer> a=new ArrayList<Integer>();
  6.     ArrayList a2=a;//使用原始类型ArrayList的引用变量指向这个参数化类型ArrayList<Integer>
  7.     a.add(1);
  8.     a2.add("abc");//添加String类型
  9.     System.out.println(a.get(0));//1
  10.     //Integer i=a.get(1);类型转换异常
  11.     System.out.println(a.get(1));//abc
  12.     /*为什么能打印出来,按理get方法的返回值是泛型类类型Integer,但a.get(1)的实际返回值确是String,为什么不爆类型转换异常*/
  13.     System.out.println(a);//[1, abc]
  14.         
  15.         ArrayList<String> v=new ArrayList<String>();
  16.     ArrayList v2=v;//使用原始类型ArrayList的引用变量指向这个参数化类型ArrayList<Integer>
  17.     v2.add(1);
  18.     v.add("abc");//添加String类型
  19.     System.out.println(v.get(0));//报java.lang.ClassCastException错误
  20.     System.out.println(v.get(1));
  21.     System.out.println(v);
  22. }
  23. }
复制代码


这个问题其实在我的另外的一个帖子里提到;只是很多人看到前面的分享部分就没看下去;在这里特别提出来,是这个问题真的困扰了很久,非常希望得到解决!若对部分泛型代码不理解,请看http://bbs.itheima.com/thread-140070-1-1.html






作者: 迷失的独白    时间: 2014-8-30 20:28
本帖最后由 迷失的独白 于 2014-8-31 00:09 编辑

http://blog.csdn.net/lonelyroamer/article/details/7868820
看这里吧,看了一半,困了,先睡了


//靠,刚才明明是这句话这报的错啊
我现在只知道错误出现在这里

                v2.add(1);//这里
                v.add("abc");
                System.out.println(v.get(0));//这里,单独注释掉就不会报错
                System.out.println(v.get(1));
                System.out.println(v);

ArrayList<Integer>
如果用for(Integer in : a)迭代的话,就会报转换异常

得到类名也会报转换异常

                a.add(1);
                a2.add("abc");
                a2.add(new Person());


                System.out.println(a.get(0));
                System.out.println(a.get(0).getClass().getName());
                System.out.println(a.get(1));
                System.out.println(a.get(1).getClass().getName());
                System.out.println(a.get(2));
                System.out.println(a.get(2).getClass().getName());
                System.out.println(a);




作者: 笑脸迷人    时间: 2014-8-30 20:53
迷失的独白 发表于 2014-8-30 20:28
你应该听了反射那段了吧,当二进制码被加载进内存中时,虚拟机忽略了泛型
但那是在反射,因为要加载二进制 ...

11行不报错~~
报错的是19行代码
作者: Fightin黑马    时间: 2014-8-30 21:37
等着解答,想了半天没想明白:Q
作者: 玥夜    时间: 2014-8-31 08:33
搞不懂   想了半天  卤煮知道了告诉我一下啊
作者: 安茹黑马    时间: 2014-8-31 12:28
想了半天,也不知道是什么原因,希望有大牛解答




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