首頁 >Java >java教程 >Java中的方差

Java中的方差

WBOY
WBOY轉載
2023-09-01 13:05:061069瀏覽

Java中的方差

Java 憑藉其強大的物件導向程式設計功能,為程式設計師提供了多種機制來開發靈活且高效的程式碼。其中一個經常被忽略但至關重要的概念是變異數。了解變異數對於掌握 Java 至關重要,尤其是在使用泛型和集合時。本文深入探討了 Java 中的方差,涵蓋其類型(協方差、逆變和不變)及其實際應用。

理解方差

變異數是指更複雜型別之間的子型別與其元件之間的子型別之間的關係。簡單來說,它決定了當這些類別用作類型參數時如何保留類別的類型層次結構。在處理泛型時,變體變得特別重要,它提供了一個框架來確保類型安全,同時允許賦值具有一定程度的靈活性。

方差可以分為三種主要類型:

  • 協方差如果 ClassB 是 ClassA 的子類,則 Collection 可以視為 Collection 的子類。

  • 逆變 - 如果 ClassB 是 ClassA 的子類,則 Collection 可以被視為 Collection 的子類。 p>

  • 不變性 - Collection 和 Collection 沒有子型別關係,無論 ClassA 和 ClassB 之間的關係為何。

讓我們更深入地研究每個概念。

Java 中的協方差

在 Java 中,協變是透過使用通配符和 extends 子句來實現的。讓我們考慮一個例子 -

List<Animal> animals = new ArrayList<>();
<List<super Cat>cats=animals;

在這種情況下,您可以將Cat 物件或其任何實例新增至cats,但您無法從cats 讀取並將結果視為Cat,因為它可能包含Cat 的任何超類型,包括Animal 或Object 。因此,您可以寫入 cats,但無法以類型安全的方式讀取它

Java 中的不變性

不變性是 Java 中的預設行為,表示 Collection 和 Collection 之間不存在子型別關係,無論 ClassA 和 ClassB 之間的關係為何。這可能看起來有限制,但它對於類型安全至關重要。在 Java 中,List 不是 List 的子類型,儘管 String 是 Object 的子類型。這是因為 Java 集合是可變的,允許這種關係會導致執行時間類型錯誤。

List<String> strings = new ArrayList<>();
// Compile error: Incompatible types
List<Object> objects = strings;

在上面的範例中,儘管 String 是 Object 的子類型,但 List 不是 List 的子類型,因此會出現編譯錯誤。

此功能最初可能看起來是一種限制,但它是 Java 類型系統的重要方面,可確保不執行不安全的操作。如果 List 是 List 的子類型,則可以將不是字串的物件加入 List 中,從而在執行時間導致 ClassCastException。

List<String> strings = new ArrayList<>();
// If this were allowed...
List<Object> objects = strings;
// ...this would put a non-String into a List<String>
objects.add(new Object());
String str= strings.get(0); // ClassCastException

此範例說明了為什麼保持類型安全的不變性至關重要。

有界型別參數與變異數

協變和逆變最常用於有界類型參數。有界類型參數是一種指示類型參數必須是某種類型的子類型(extends 關鍵字)或超類型(super 關鍵字)的方法。這允許靈活地決定可以將哪些類型傳遞給方法,同時仍然保持類型安全。

例如,您可能有一個對 Number 及其所有子類別的清單進行操作的方法 -

public <T extends Number> void processNumbers(List<T> numbers) { /* ... */ }

在此方法中,T 是有界型別參數,必須是 Number 或 Number 的子型別。這允許該方法對 List、List、List 等進行操作,顯示協方差

結論

總之,了解 Java 中的變異數對於有效使用泛型和集合至關重要。它允許靈活的代碼,同時確保類型安全。

協變,使用extends關鍵字,允許子類別取代超類,從而實現更通用的物件處理。另一方面,逆變允許超類別替代子類,從而能夠在更具體的物件上執行更廣泛的操作。

不變性透過確保不同類型的集合(即使透過繼承相關)保持其唯一性並防止執行時間類型錯誤,從而保持類型安全。

对象>字符串>

对象>字符串>

#

以上是Java中的方差的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除