public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
對方法的調用不會進行類型檢查。我甚至不能投的參數如下:爲什麼列表<Number>不是列表<Object>的子類型?
wahey((List<Object>) new LinkedList<Number>());
從我的研究,我已經收集,對於不允許這樣做的原因是類型安全。如果我們允許做上述情況,那麼我們可以有以下幾種:
List<Double> ld;
wahey(ld);
裏面的方法wahey,我們可以一些字符串添加到輸入表(作爲參數保持List<Object>
參考)。現在,在方法調用之後,ld引用一個類型爲List<Double>
的列表,但實際列表包含一些String對象!
這似乎不同於普通的Java沒有泛型的工作方式。例如:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
我們在這裏做的基本上是同樣的事情,但這次將通過編譯時檢查,只有在運行時出現故障。帶有列表的版本不會編譯。
這使我相信這純粹是一個關於泛型類型限制的設計決定。我希望對這個決定有所評論?
相關(不完全重複,雖然正確答案基本相同):http:// stackoverflow。com/questions/251298/why-is-someclass-super-t-not-equivalent-to-someclasst-in-java-generic-types – Kip 2009-08-06 17:44:04
藝術術語是**協變** - 我提到這是因爲它使它更容易查找它,包括堆棧溢出(如果你想看看我要說的 - 在C#的上下文中,但它也適用於Java - 搜索[協方差用戶: 95810])。 – 2009-08-06 17:44:25
''wahey((列表