首頁  >  文章  >  Java  >  協變、不變和逆變如何影響程式設計中的型別關係?

協變、不變和逆變如何影響程式設計中的型別關係?

Barbara Streisand
Barbara Streisand原創
2024-11-12 03:28:01217瀏覽

How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

簡單英語中的協變、不變和逆變:全面解釋

協變、不變和逆變是描述如何不變和逆變是描述如何類型和子類型之間的關係受類型轉換的影響。這些概念對於理解程式語言中的多態性和類型安全起著至關重要的作用。

協方差

協方差表示子類型關係透過型別轉換得以保留。換句話說,如果類型 A 是類型 B 的子類型,則變換後的類型 f(A) 也是 f(B) 的子類型。例如,考慮轉換f(A) = List,其中List 宣告為:

class List<T> { ... }

Since List;是List 的子類型,我們有f(String) = List;是f(Object) = List 的子型別。因此,f 是協變的。

逆變

逆變與協變相反。它表明子類型關係透過類型轉換被顛倒了。如果 A 是 B 的子類型,則 f(B) 是 f(A) 的子類型。例如,考慮變換 f(A) = A[]。這個轉換顛倒了數組之間的子類型關係:Object[] 是 String[] 的子類型,但 String[] 不是 Object[] 的子類型。這使得 f 逆變。

不變性

當協變和逆變都不成立時,就會發生不變性。換句話說,類型轉換不會保留或反轉子類型關係。例如,考慮變換 f(A) = Map。如果 A 是 B 的子類型,則不能保證 f(A) = Map是 f(B) = Map 的子類型。因此,f 是不變的。

在語言特徵的應用

  • 賦值:Java中的物件類型是不變的。因此,賦值語句ArrayList字串 = new ArrayList();無效,但 Object[] 物件 = new String[1];有效。
  • 方法呼叫:方法呼叫依賴子型別關係進行型別檢查。方法 method(ArrayList list) 可以使用參數 new ArrayList() 來調用,但不能使用 new ArrayList() 呼叫。
  • 方法重寫:重寫時方法中,參數型別必須是協變或不變的,而回傳型別必須是協變或不變的。例如,以下程式碼是有效的,因為傳回類型是協變的:
class List<T> { ... }

理解協變、不變性和逆變對於理解多態性操作的行為和確保程式設計中的類型安全至關重要。

以上是協變、不變和逆變如何影響程式設計中的型別關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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