黑马程序员技术交流社区
标题:
泛型一点小问题
[打印本页]
作者:
霍振鹏
时间:
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>的父类。下面代码编译时就报错
ArrayList<String> list1=new ArrayList<>();
Arraylist<Object> list2=list1;//代码提示错误
list2.add(new Object());
复制代码
因为泛型是在1.5的时候加入的 ,java变得更严谨,它的原则是编译时期不提示类型转换异常,那么运行时就不出现类型转换异常。因为list1和list2都是指向同一片存储空间,往list2中添加进了Object类型的对象,相当于list1也添加了。所以运行时必然出现转换异常
java的泛型这样定义就避免了这种情况。将这种错误提示在了编译时期。
早期的java没有这么严谨。如下面的代码编译就不报错,但运行的时候会抛出异常。
Integer[] i=new Integer[10];
Number[] n=i;
n[1]=6.5;
复制代码
作者:
梦里花-静
时间:
2014-4-14 18:06
在基础加强视频中,张孝祥老师讲到过这一点。当时老师说道:参数化类型(ArrayLisr<String>)不考虑类型参数(ArrayLisr<String>中的String)的继承关系。String是Object的子类。所以Collection<Object> coll1=list1;这句话不对。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2