黑马程序员技术交流社区
标题: 类型转换 [打印本页]
作者: 杨千里 时间: 2012-9-11 03:39
标题: 类型转换
本帖最后由 杨千里 于 2012-9-14 19:41 编辑
String 类属于Object,但是下面的代码却编译失败?
List<String> Is = new ArrayList<String>();
List<Object>Io = Is;
作者: 郑世光 时间: 2012-9-11 07:38
本帖最后由 郑世光 于 2012-9-11 07:50 编辑
泛型是一种安全机制,是为了确定参数的类型。不能这样做的原因是泛型的 不能协变 特性。
你在第一句话List<String> Is = new ArrayList<String>();中指明 Is 中存放的是String类型,但在第二句中却将Is 中
放的是Object类型。泛型中具体的类需要保持一致。如果想让 List<Object>Io = Is; 编译通过,就需要用泛型的限定,
可修改为 List<? super String>Io = Is;
作者: 朱烈葵 时间: 2012-9-11 08:32
想了想 还是楼上说的对
作者: 吴通 时间: 2012-9-11 08:54
楼主:
加泛型就是为了限制参数类型,如果楼主想要
String的父类也能编译成功可以这样写
List<? super String> Is = new ArrayList<? super String>();
这样限定之后就说明可以接收String和string的父类
作者: 舒远 时间: 2012-9-11 09:18
大家做了测试了么?即使按照2楼说的那样修改List<? super String> lo = ls;
但依旧没法将Object类型的对象添加到lo中,编译还是没法通过。
作者: AngieFans85 时间: 2012-9-11 10:01
List<String> Is = new ArrayList<String>();
这句的意思是,完全限定Is只能存放String型的数据.
List<Object>Io = Is;
这句的意思是,完全限定Io只能存放Object型的数据,完全限定的类型参数,不存放多态的说法.
如果你一定要用理解的"多态"思维来做,那用来接收的引用,其类型参数绝对不能完全限定了,你可以这样玩:
List<? extends Object>Io = Is;
这样就对了,就代表Io的类型参数可以接收Object类型的数据,也可以接收Object子类类型的数据,而Is的类型参数正好是String类型的数据,所以这样写才正确.
作者: AngieFans85 时间: 2012-9-11 10:04
吴通 发表于 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>();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |