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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨千里 中级黑马   /  2012-9-11 03:39  /  1646 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨千里 于 2012-9-14 19:41 编辑


String 类属于Object,但是下面的代码却编译失败?
List<String> Is = new ArrayList<String>();
List<Object>Io = Is;



6 个回复

倒序浏览
本帖最后由 郑世光 于 2012-9-11 07:50 编辑

泛型是一种安全机制,是为了确定参数的类型。不能这样做的原因是泛型的  不能协变  特性。
你在第一句话List<String> Is = new ArrayList<String>();中指明 Is 中存放的是String类型,但在第二句中却将Is 中
放的是Object类型。泛型中具体的类需要保持一致。如果想让 List<Object>Io = Is; 编译通过,就需要用泛型的限定,
可修改为 List<? super String>Io = Is;   


回复 使用道具 举报
想了想 还是楼上说的对
回复 使用道具 举报
楼主:
加泛型就是为了限制参数类型,如果楼主想要
String的父类也能编译成功可以这样写
List<? super String> Is = new ArrayList<? super String>();
这样限定之后就说明可以接收String和string的父类
回复 使用道具 举报
大家做了测试了么?即使按照2楼说的那样修改List<? super String> lo =  ls;
但依旧没法将Object类型的对象添加到lo中,编译还是没法通过。
回复 使用道具 举报
List<String> Is = new ArrayList<String>();
这句的意思是,完全限定Is只能存放String型的数据.

List<Object>Io = Is;
这句的意思是,完全限定Io只能存放Object型的数据,完全限定的类型参数,不存放多态的说法.

如果你一定要用理解的"多态"思维来做,那用来接收的引用,其类型参数绝对不能完全限定了,你可以这样玩:
List<? extends Object>Io = Is;
这样就对了,就代表Io的类型参数可以接收Object类型的数据,也可以接收Object子类类型的数据,而Is的类型参数正好是String类型的数据,所以这样写才正确.
回复 使用道具 举报
吴通 发表于 2012-9-11 08:54
楼主:
加泛型就是为了限制参数类型,如果楼主想要
String的父类也能编译成功可以这样写

List<? super String> Is = new ArrayList<? super String>();
这样写显然是不正确的,new ArrayList<? super String>();实例化时,类型参数必须给一个具体的类型.例如:
List<? super String> Is = new ArrayList<String>();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马