首頁  >  文章  >  Java  >  協變、不變與逆變:子類型關係如何轉變?

協變、不變與逆變:子類型關係如何轉變?

DDD
DDD原創
2024-11-12 06:07:01655瀏覽

Covariance, Invariance, and Contravariance: How Do Subtype Relationships Transform?

理解協變、不變和逆變

理解協變、不變和逆變的複雜性對於掌握程式設計中的類型關係至關重要。

什麼是它們?

本質上,這些術語描述了類型和子類型之間的關係如何轉換。讓我們考慮一個場景,其中有兩種類型 A 和 B,以及一個變換函數 f。假設 ≤ 表示子類型關係(A ≤ B 表示 A 是 B 的子類型)。

  • 協變: 如果A ≤ B 暗示f(A),則f 是協變的≤ f(B).
  • 逆變: f 是如果A ≤ B 意味著f(B) ≤ f(A),則逆變。
  • 不變: 若上述條件都不成立,則 f 是不變的。

Java 示例

讓我們探索一些Java 示例澄清這些概念:

在程式設計中的應用

子類型起著至關重要的作用in:

  • 賦值: x = y 僅當typeof(y) ≤ typeof(x)時有效。

    • 在 Java 中, ArrayList;不能指派給 ArrayList
  • 方法呼叫: result = method(a) 要求typeof(a) ≤ typeof(parameter) 且returntype ≤ typeof(result).

      無法回傳Number[] by method(ArrayList) 因為Number[] ≠ ArrayList[].
  • Overriding: 重寫方法的方法參數必須是重寫方法的方法參數被重寫方法的超類型,並且傳回類型a

      在 Java 1.4 中,重寫方法中的回傳類型必須相同。
    • 在 Java 1.5 及更高版本中,允許協變返回類型(例如,Collection 中的 Iterator 和 Collection 中的 ListIterator)清單)。
理解這些概念對於有效處理類型關係的複雜性至關重要。

以上是協變、不變與逆變:子類型關係如何轉變?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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