黑马程序员技术交流社区

标题: 泛型一点小问题 [打印本页]

作者: 霍振鹏    时间: 2014-4-14 15:43
标题: 泛型一点小问题
大家能不能给我解释一下,这个编译为什么通不过?
ArrayList<String> list1=new ArrayList<String>();
Collection<Object> coll1=list1;//这行代码编译器是通不过的
作者: leon_hm    时间: 2014-4-14 16:19
泛型里面必须限定类型一样。
Collection<Object> coll1=list1;//等号左边的是Object , 右边的是String.类型不一样。所以编译不通过
作者: anqi    时间: 2014-4-14 17:42
你可能认为ArrayList<Object>是 Array<String>的父类,其实不是,所以Collection<Object>也不是 Array<String>的父类。下面代码编译时就报错
  1. ArrayList<String> list1=new ArrayList<>();
  2.         Arraylist<Object> list2=list1;//代码提示错误
  3.         list2.add(new Object());
  4.         
复制代码
因为泛型是在1.5的时候加入的 ,java变得更严谨,它的原则是编译时期不提示类型转换异常,那么运行时就不出现类型转换异常。因为list1和list2都是指向同一片存储空间,往list2中添加进了Object类型的对象,相当于list1也添加了。所以运行时必然出现转换异常
java的泛型这样定义就避免了这种情况。将这种错误提示在了编译时期。
早期的java没有这么严谨。如下面的代码编译就不报错,但运行的时候会抛出异常。
  1. Integer[] i=new Integer[10];
  2.         Number[] n=i;
  3.         n[1]=6.5;
  4.         
复制代码




作者: 梦里花-静    时间: 2014-4-14 18:06
在基础加强视频中,张孝祥老师讲到过这一点。当时老师说道:参数化类型(ArrayLisr<String>)不考虑类型参数(ArrayLisr<String>中的String)的继承关系。String是Object的子类。所以Collection<Object> coll1=list1;这句话不对。




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