JAVA泛型通配符的上界和下界的具體使用
在 Java 泛型中,通配符(Wildcard) 用于表示未知的類型。為了增強(qiáng)靈活性和安全性,Java 提供了對通配符的上界(Upper Bound) 和 下界(Lower Bound) 的限制。
一、通配符概述
- 基本通配符:
?
- 表示未知類型。
- 示例:
List<?>
表示一個元素類型未知的列表。
?? 使用 List<?> 后,不能向其中添加除 null 外的任何元素(因為編譯器不知道具體類型),但可以讀取為 Object。
二、通配符的上界(Upper Bound Wildcard)
語法:
? extends T
- 表示“某個未知類型,它是
T
的子類型”。 - 適用于“只讀不寫”的場景。
示例:
List<? extends Number> list = new ArrayList<Integer>();
可以讀取元素為 Number
類型:
Number num = list.get(0);
? 不允許添加元素(除了 null
):
list.add(123); // 編譯錯誤!不知道實際類型是 Integer 還是 Double 等
用途:
- 當(dāng)你只需要從集合中讀取數(shù)據(jù),并希望它能接受多種子類型時使用。
三、通配符的下界(Lower Bound Wildcard)
語法:
? super T
- 表示“某個未知類型,它是
T
的父類型”。 - 適用于“只寫不讀”的場景。
示例:
List<? super Integer> list = new ArrayList<Number>();
可以添加 Integer
類型的對象:
list.add(10);
? 讀取時只能作為 Object
類型:
Object obj = list.get(0); // 無法知道具體是 Number、Object 還是其他父類
用途:
- 當(dāng)你需要將某種具體類型的數(shù)據(jù)寫入集合,并且該集合的類型必須是它的父類時使用。
四、對比總結(jié)
通配符形式 | 含義 | 可否添加元素 | 可否讀取元素 | 典型用途 |
---|---|---|---|---|
? | 任意類型 | ? | ?(作為 Object) | 通用只讀集合 |
? extends T | T 或其子類 | ? | ?(作為 T) | 讀取特定類型的集合 |
? super T | T 或其父類 | ? | ?(作為 Object) | 寫入特定類型的集合 |
小技巧:PECS 原則(Producer Extends, Consumer Super)
這是理解泛型通配符的經(jīng)典原則:
- Producer(生產(chǎn)者) → 使用
extends
(只讀) - Consumer(消費(fèi)者) → 使用
super
(只寫)
示例代碼:
public static void copy(List<? extends Number> source, List<? super Number> dest) { for (Number number : source) { dest.add(number); // 寫入到 dest } }
總結(jié)
- 使用 ? extends T 來限定上界,適合讀操作。
- 使用 ? super T 來限定下界,適合寫操作。
- 結(jié)合 PECS 原則,可以更安全地使用泛型集合。
到此這篇關(guān)于JAVA泛型通配符的上界和下界的具體使用的文章就介紹到這了,更多相關(guān)JAVA泛型通配符上界和下界內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GraalVM系列Native?Image?Basics靜態(tài)分析
這篇文章主要為大家介紹了GraalVM系列Native?Image?Basics靜態(tài)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn)
在開發(fā)中經(jīng)常遇到多個實體類有共同的屬性字段,這些字段屬于公共字段,本文主要介紹了MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-08-08Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過濾實現(xiàn)代碼
這篇文章主要介紹了Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過濾實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Java Comparable和Comparator對比詳解
這篇文章主要介紹了Java Comparable和Comparator對比詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11