java泛型协方差

时间:2010-04-18 02:09:42

标签: java generics alias covariance

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

下,

  

泛型不协变

作者说,

  

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

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

3 个答案:

答案 0 :(得分:41)

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

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

结论:泛型不协变。

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

答案 1 :(得分:8)

如果你能做到这样的事情:

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

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

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

答案 2 :(得分:-2)

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