Java泛型协方差Java泛型协方差(java generics covariance)

2019-05-10 09:26发布

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

下,

泛型不是协变

笔者状态,

由于LN是一个列表,添加一个Float似乎完全合法的。 但是,如果LN用李别名,那么将打破类型安全承诺在李的定义隐含的 - 它是一个整数列表,这就是为什么泛型类型不能协变的。

我不明白它说:“如果LN是化名李”的部分。 是什么笔者通过别名?指(参考?)。 代码段的引用线之上似乎说明什么是Java和不为什么非法的。 这将是对我来说非常有益的,如果有人可以用一个例子来说明。 提前致谢。

Answer 1:

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

在Java中,整数数量继承(java.lang.Number) ,所以直观,任何一个Integer (java.lang.Integer)也是一个数字,而是什么文章指出的是,与泛型这是行不通的那这样,因为考虑到例如,你可能最终把一个浮动(这是一个号码)成List<Integer>这是违法的,因为浮动不是整数。

结论:泛型不是协变。

注:我建议你阅读有效的Java(第2版)第5章:泛型。



Answer 2:

如果你可以做这样的事情:

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

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

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

事情会去非常错误的。 在这个例子酒吧是foo的别名,如果你能做到这一点,你会失去类型安全是仿制药存在的主要原因。



Answer 3:

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


文章来源: java generics covariance