Effective Java Item31 使用有邊界的通配符提高API的靈活性
整理Effective Java書中Item 31: Use bounded wildcards to increase API flexibility心得筆記
主旨
使用有邊界的通配符可以提高API的靈活性,同時保持類型安全。這樣能讓你的Java程式碼支援更多的類型,並且保證不會發生類型錯誤。
劃重點
有邊界的通配符是Java泛型中的一個強大工具,它能讓方法處理多種不同類型,同時保持程式碼的類型安全。
? extends T允許傳入T及其子類。? super T允許傳入T及其父類。- 使用邊界通配符能讓你的API更加靈活,減少程式碼重複。
什麼是有邊界的通配符?
在Java中,通配符?允許你在泛型中使用不確定的類型。當你需要限制這些類型時,就可以使用有邊界的通配符。
? extends T表示這個通配符的類型是T或T的子類。? super T表示這個通配符的類型是T或T的父類。
範例:
假設我們有一個需要處理Number類型及其子類(如Integer、Double)的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支援更多類型的物件,從而提高程式碼的靈活性和可維護性。