我无法理解下面的文章: http://www.ibm.com/developerworks/java/library/j-jtp01255.html
下,
泛型不是协变
笔者状态,
由于LN是一个列表,添加一个Float似乎完全合法的。 但是,如果LN用李别名,那么将打破类型安全承诺在李的定义隐含的 - 它是一个整数列表,这就是为什么泛型类型不能协变的。
我不明白它说:“如果LN是化名李”的部分。 是什么笔者通过别名?指(参考?)。 代码段的引用线之上似乎说明什么是Java和不为什么非法的。 这将是对我来说非常有益的,如果有人可以用一个例子来说明。 提前致谢。
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章:泛型。
如果你可以做这样的事情:
List<Float> foo;
List<Object> bar;
foo = new ArrayList<Float>();
bar = foo;
foo.add(1.0f);
bar.add("Hello");
事情会去非常错误的。 在这个例子酒吧是foo的别名,如果你能做到这一点,你会失去类型安全是仿制药存在的主要原因。
public class vechicle {
void drive(){
}
}
class car extends vechicle{
//Covariance
vechicle getObject(){
return new car();
}
//contravariance
car getmyObject(){
return (car) new vechicle();
}
}