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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 霍振鹏 中级黑马   /  2014-4-14 15:43  /  720 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家能不能给我解释一下,这个编译为什么通不过?
ArrayList<String> list1=new ArrayList<String>();
Collection<Object> coll1=list1;//这行代码编译器是通不过的

3 个回复

倒序浏览
泛型里面必须限定类型一样。
Collection<Object> coll1=list1;//等号左边的是Object , 右边的是String.类型不一样。所以编译不通过
回复 使用道具 举报
你可能认为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.         
复制代码



评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
在基础加强视频中,张孝祥老师讲到过这一点。当时老师说道:参数化类型(ArrayLisr<String>)不考虑类型参数(ArrayLisr<String>中的String)的继承关系。String是Object的子类。所以Collection<Object> coll1=list1;这句话不对。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马