首頁  >  文章  >  Java  >  為什麼 Java 泛型不是協變的?

為什麼 Java 泛型不是協變的?

Susan Sarandon
Susan Sarandon原創
2024-11-20 14:16:181003瀏覽

Why Are Java Generics Not Covariant?

Java 泛型與協變:了解限制

泛型中的協變是指子類型在不違反規則的情況下替換其超類型的能力類型安全。然而,在 Java 中,泛型不是協變的,這意味著子類型不能指派給超類型變數。

為了說明這個概念,請考慮以下程式碼片段:

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

這裡,ln 是別名為 li,這表示 ln 引用與 li 相同的列表。然而,ln 被宣告為 List,表示它可以保存任何擴展 Number 的類型。這包括浮點數,它不是整數。

如果允許協變,上面的程式碼將是合法的,但它會違反型別安全。透過分配列表 (即,li)到列表 (即 ln),我們可能會在列表中添加非整數值,這會損害其作為整數列表的完整性。

因此,為了維護型別安全,Java 泛型不是協變的。此限制可確保子類型無法在泛型上下文中與超類型互換使用,從而防止潛在的類型錯誤。

以上是為什麼 Java 泛型不是協變的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn