首頁 >後端開發 >C++ >物件導向程式設計中協變和逆變有什麼區別?

物件導向程式設計中協變和逆變有什麼區別?

Linda Hamilton
Linda Hamilton原創
2025-01-20 17:12:10855瀏覽

What is the Difference Between Covariance and Contravariance in Object-Oriented Programming?

深入理解協變與逆變

物件導向程式設計中的協變和逆變允許在保持類型安全性的前提下,在不同情況下替換不同的類型。

協變 (Covariance)

協變適用於將“超類型”(更通用)作為“子類型”(更具體)在輸出位置(例如,作為返回值)的替代。在這種情況下,您可以將超類型的清單賦值給子類型的清單:

<code class="language-java">List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits; // 协变:List<Apple> 是 List<Fruit> 的子类型</code>

逆變 (Contravariance)

逆變適用於將「子類型」作為「超類型」在輸入位置(例如,作為方法參數)的替代。在這種情況下,您可以將接受子類型的 lambda 表達式傳遞給期望超類型的 lambda 表達式:

<code class="language-java">Comparator<Apple> compareApples = (a, b) -> a.compareTo(b);
Comparator<Fruit> compareFruits = compareApples; // 逆变:Comparator<Apple> 是 Comparator<Fruit> 的子类型</code>

「in」 和 “out” 關鍵字

泛型中的「in」和「out」關鍵字用來指定泛型參數的變異數。 「out」表示協變,「in」表示逆變。

MyInterface 介面的範例中:

  • 協變(傳回值):
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
  • 逆變(輸入參數):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>

總而言之,協變和逆變允許根據泛型類型的預期用途進行安全的類型替換,從而在提供程式碼設計靈活性的同時確保類型安全。

以上是物件導向程式設計中協變和逆變有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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