首頁  >  文章  >  Java  >  Java 中的協變、不變和逆變:有什麼區別以及為什麼我應該關心?

Java 中的協變、不變和逆變:有什麼區別以及為什麼我應該關心?

Susan Sarandon
Susan Sarandon原創
2024-11-12 01:38:02265瀏覽

Covariance, Invariance, and Contravariance in Java: What's the Difference and Why Should I Care?

用簡單英語解釋協方差、不變性和逆變

簡介:
理解協方差、不變性、逆變可能具有挑戰性,但對於理解Java 中的類型轉換和關係。本文旨在簡化這些概念並提供現實世界的範例以增強理解。

協方差:
協方差描述了保留子類型關係的類型轉換。如果類型 A 是類型 B 的子類型,則轉換 f(A) 將導致 f(B) 成為 f(A) 的子類型。

範例:
考慮變換 f(List) = List。由於列表是 List 的超類型,則 List>>是List>的超類型。這演示了協變性。

不變性:
當子類型關係不受型別轉換影響時,就會出現不變性。如果 A 是 B 的子類型,則 f(A) 不會是 f(B) 的子類型或超類型。

範例:
Java 泛型以不變方式表現。例如,f(ArrayList)=ArrayList。由於 ArrayList和 ArrayList是不同的類型,也不是另一個的子類型或超類型。

逆變:
逆變是協方差的逆。子類型關係在轉換期間顛倒。如果 A 是 B 的子類型,則 f(B) 將是 f(A) 的子類型。

範例:
考慮型別轉換 f(A[]) =B[]。在Java 中,陣列是協變的,這表示如果A[] 是B[] 的子類型,那麼f(A[]) = B[] 也將是f(B[]) = B[] 的子類型。

應用:
協變、不變性和逆變在Java:

  • 賦值:只有相容類型的對象才能互相賦值。編譯器檢查來源類型是否為目標類型的子類型。
  • 方法呼叫:呼叫方法時,實際參數必須是宣告的參數型別的子型別。方法的傳回類型必須是預期傳回類型的超類型。
  • 重寫:在 Java 中,重寫方法的參數和傳回型別必須與原始方法的型別相符或協變。

以上是Java 中的協變、不變和逆變:有什麼區別以及為什麼我應該關心?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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