为了账号安全,请及时绑定邮箱和手机立即绑定

java泛型协方差

java泛型协方差

一只萌萌小番薯 2019-07-23 15:03:42
java泛型协方差我无法理解以下文章:http: //www.ibm.com/developerworks/java/library/j-jtp01255.html下,泛型不是协变的作者说,因为ln是一个List,所以添加一个Float似乎是完全合法的。但是如果ln与li混淆,那么它将破坏li定义中隐含的类型安全承诺 - 它是一个整数列表,这就是泛型类型不能协变的原因。我无法理解它所说的“如果ln与li混淆”的部分。作者对别名的含义是什么?(参考?)。引用行上方的代码片段似乎说明了什么在java中是非法的而不是为什么。如果有人能用一个例子来解释,对我来说会很有帮助。提前致谢。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

List<Integer> li = new ArrayList<Integer>();List<Number> ln = li; // illegalln.add(new Float(3.1415));

在Java中,Integer继承自Number (java.lang.Number),因此直观地说,任何Integer (java.lang.Integer)都是一个数字,但是那篇文章指出的是,泛型它不能以这种方式工作,因为考虑到这个例子,你最终会放一个浮点数(这是一个数字)成a List<Integer>,这是非法的,因为float不是整数。

结论:泛型不是协变的。

注意:我建议您阅读Effective Java(第2版)第5章:泛型。


查看完整回答
反对 回复 2019-07-23
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

如果你能做这样的事情:

List<Float> foo;List<Object> bar;foo = new ArrayList<Float>();bar = foo;foo.add(1.0f);bar.add("Hello");

事情会非常错误。在这个例子中,bar是foo的别名,如果你能做到这一点,你将失去类型安全性,这是泛型存在的主要原因。


查看完整回答
反对 回复 2019-07-23
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

public class vechicle {void drive(){}}class car extends vechicle{
        //Covariance
    vechicle getObject(){
        return new car();
    }
        //contravariance
    car getmyObject(){
        return (car) new vechicle(); 
    }}


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 405 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信