說,我有一個方法:爲什麼Java的類型推斷如此薄弱?
public static <T> Collection<T> addToCollection(T element, Collection<T> collection) {
collection.add(element);
return collection;
}
試圖編譯這段代碼時
然後:
Integer i = 42;
Collection<Integer> result = addToCollection(i, Collections.emptyList());
我得到一個錯誤Type mismatch: cannot convert from Collection<Object> to Collection<Integer>
。 任何人都可以解釋爲什麼類型系統不能推斷Collections.emptyList()應該是Collection<Integer>
類型?
上面的例子顯然很人造,但我總是偶然發現了這個限制,這真的很煩人。在閱讀之後有效的Java我發現你可以簡單地做Collections.<Integer>emptyList()
(必須說,這對我來說當時是一個啓示)並且一切編譯都很順利,但是當你有一些複雜的類型時,它確實是一個滋擾。
我只是想知道這是否是某種錯誤,或者是否有任何有效的理由使它以這種方式工作?
請您重溫一下這個標題嗎? – Kobi
談一下把水壺調黑的方法。 Collections.emptyList()返回一個不可修改的List,所以代碼無法工作。 – Kayaman
@Kayaman旁邊的點,因爲OP表示自己。問題是關於推理的原則,運行時沒有考慮到它。 –