java泛型協(xié)方差我無法理解以下文章:http: //www.ibm.com/developerworks/java/library/j-jtp01255.html下,泛型不是協(xié)變的作者說,因為ln是一個List,所以添加一個Float似乎是完全合法的。但是如果ln與li混淆,那么它將破壞li定義中隱含的類型安全承諾 - 它是一個整數列表,這就是泛型類型不能協(xié)變的原因。我無法理解它所說的“如果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不是整數。
結論:泛型不是協(xié)變的。
注意:我建議您閱讀Effective Java(第2版)第5章:泛型。

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
如果你能做這樣的事情:
List<Float> foo;List<Object> bar;foo = new ArrayList<Float>();bar = foo;foo.add(1.0f);bar.add("Hello");
事情會非常錯誤。在這個例子中,bar是foo的別名,如果你能做到這一點,你將失去類型安全性,這是泛型存在的主要原因。

蕪湖不蕪
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(); }}
添加回答
舉報
0/150
提交
取消