深入理解協變與逆變
物件導向程式設計中的協變和逆變允許在保持類型安全性的前提下,在不同情況下替換不同的類型。
協變 (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中文網其他相關文章!