繁体   English   中英

java泛型协方差

[英]java generics covariance

我无法理解以下文章: http//www.ibm.com/developerworks/java/library/j-jtp01255.html

下,

泛型不是协变的

作者说,

因为ln是一个List,所以添加一个Float似乎是完全合法的。 但是如果ln与li混淆,那么它将破坏li定义中隐含的类型安全承诺 - 它是一个整数列表,这就是泛型类型不能协变的原因。

我无法理解它所说的“如果ln与li混淆”的部分。 作者对别名的含义是什么?(参考?)。 引用行上方的代码片段似乎说明了什么在java中是非法的而不是为什么。 如果有人能用一个例子来解释,对我来说会很有帮助。 提前致谢。

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

在Java中,Integer继承自Number (java.lang.Number) ,因此直观地说,任何Integer (java.lang.Integer)都是一个数字,但是文章指出的是泛型它不起作用因为考虑到这个例子,你可能最终将一个float(这是一个Number)放入List<Integer> ,这是非法的,因为float不是一个整数。

结论:泛型不是协变的。

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

如果你能做这样的事情:

List<Float> foo;
List<Object> bar;

foo = new ArrayList<Float>();
bar = foo;

foo.add(1.0f);
bar.add("Hello");

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM