整理Effective Java書中Item 31: Use bounded wildcards to increase API flexibility心得筆記

主旨

使用有邊界的通配符可以提高API的靈活性,同時保持類型安全。這樣能讓你的Java程式碼支援更多的類型,並且保證不會發生類型錯誤。

劃重點

有邊界的通配符是Java泛型中的一個強大工具,它能讓方法處理多種不同類型,同時保持程式碼的類型安全。

  1. ? extends T 允許傳入T及其子類。
  2. ? super T 允許傳入T及其父類。
  3. 使用邊界通配符能讓你的API更加靈活,減少程式碼重複。

什麼是有邊界的通配符?

在Java中,通配符?允許你在泛型中使用不確定的類型。當你需要限制這些類型時,就可以使用有邊界的通配符。

  • ? extends T表示這個通配符的類型是TT的子類。
  • ? super T表示這個通配符的類型是TT的父類。

範例:
假設我們有一個需要處理Number類型及其子類(如IntegerDouble)的API方法。

public void printNumbers(List<? extends Number> numbers) {
    for (Number number : numbers) {
        System.out.println(number);
    }
}

這段程式碼允許我們傳入任何Number的子類型,例如List<Integer>List<Double>,但不會接受String等與Number無關的類型。這樣可以確保方法的類型安全。

為什麼要使用有邊界的通配符?

  • 提高API的靈活性:透過使用有邊界的通配符,你可以讓方法處理更多類型的物件,而無需為每一種可能的類型編寫重載版本。

  • 保證類型安全:即使方法能接受多種類型,邊界通配符仍然能夠確保不會出現類型錯誤。這是設計健壯API的關鍵。

  • 減少重複程式碼:透過使用泛型和通配符,避免了為每種具體類型編寫冗長的程式碼。

真實世界示例:添加數字的方法

假設你需要將數字添加到集合中。如果你將數字添加到List<? super Integer>中,你正在處理一個可以是List<Number>List<Object>List<Integer>類型的列表。這種靈活性使得程式碼能夠適應更多的情況。

public void addNumbers(List<? super Integer> list) {
    list.add(10); // 可以添加Integer
    list.add(20); // 另一個Integer也可以添加
}

小結

有邊界的通配符是設計靈活、可重用API的一個重要工具。它不僅能提升程式碼的可擴展性,還能保持類型安全。通過合理使用? extends T和? super T,你可以讓API支援更多類型的物件,從而提高程式碼的靈活性和可維護性。