JAVA泛型通配符的上界和下界的具體使用
在 Java 泛型中,通配符(Wildcard) 用于表示未知的類(lèi)型。為了增強(qiáng)靈活性和安全性,Java 提供了對(duì)通配符的上界(Upper Bound) 和 下界(Lower Bound) 的限制。
一、通配符概述
- 基本通配符:
?- 表示未知類(lèi)型。
- 示例:
List<?>表示一個(gè)元素類(lèi)型未知的列表。
?? 使用 List<?> 后,不能向其中添加除 null 外的任何元素(因?yàn)榫幾g器不知道具體類(lèi)型),但可以讀取為 Object。
二、通配符的上界(Upper Bound Wildcard)
語(yǔ)法:
? extends T
- 表示“某個(gè)未知類(lèi)型,它是
T的子類(lèi)型”。 - 適用于“只讀不寫(xiě)”的場(chǎng)景。
示例:
List<? extends Number> list = new ArrayList<Integer>();
可以讀取元素為 Number 類(lèi)型:
Number num = list.get(0);
? 不允許添加元素(除了 null):
list.add(123); // 編譯錯(cuò)誤!不知道實(shí)際類(lèi)型是 Integer 還是 Double 等
用途:
- 當(dāng)你只需要從集合中讀取數(shù)據(jù),并希望它能接受多種子類(lèi)型時(shí)使用。
三、通配符的下界(Lower Bound Wildcard)
語(yǔ)法:
? super T
- 表示“某個(gè)未知類(lèi)型,它是
T的父類(lèi)型”。 - 適用于“只寫(xiě)不讀”的場(chǎng)景。
示例:
List<? super Integer> list = new ArrayList<Number>();
可以添加 Integer 類(lèi)型的對(duì)象:
list.add(10);
? 讀取時(shí)只能作為 Object 類(lèi)型:
Object obj = list.get(0); // 無(wú)法知道具體是 Number、Object 還是其他父類(lèi)
用途:
- 當(dāng)你需要將某種具體類(lèi)型的數(shù)據(jù)寫(xiě)入集合,并且該集合的類(lèi)型必須是它的父類(lèi)時(shí)使用。
四、對(duì)比總結(jié)
| 通配符形式 | 含義 | 可否添加元素 | 可否讀取元素 | 典型用途 |
|---|---|---|---|---|
| ? | 任意類(lèi)型 | ? | ?(作為 Object) | 通用只讀集合 |
| ? extends T | T 或其子類(lèi) | ? | ?(作為 T) | 讀取特定類(lèi)型的集合 |
| ? super T | T 或其父類(lèi) | ? | ?(作為 Object) | 寫(xiě)入特定類(lèi)型的集合 |
小技巧:PECS 原則(Producer Extends, Consumer Super)
這是理解泛型通配符的經(jīng)典原則:
- Producer(生產(chǎn)者) → 使用
extends(只讀) - Consumer(消費(fèi)者) → 使用
super(只寫(xiě))
示例代碼:
public static void copy(List<? extends Number> source,
List<? super Number> dest) {
for (Number number : source) {
dest.add(number); // 寫(xiě)入到 dest
}
}
總結(jié)
- 使用 ? extends T 來(lái)限定上界,適合讀操作。
- 使用 ? super T 來(lái)限定下界,適合寫(xiě)操作。
- 結(jié)合 PECS 原則,可以更安全地使用泛型集合。
到此這篇關(guān)于JAVA泛型通配符的上界和下界的具體使用的文章就介紹到這了,更多相關(guān)JAVA泛型通配符上界和下界內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot深入刨析數(shù)據(jù)層技術(shù)
這篇文章主要介紹了SpringBoot數(shù)據(jù)層技術(shù)的解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解
這篇文章主要給大家介紹了關(guān)于Java中轉(zhuǎn)換器設(shè)計(jì)模式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
一文讓你徹底學(xué)會(huì)Java之BigInteger類(lèi)常用操作
這篇文章主要介紹了Java之BigInteger類(lèi)常用操作的相關(guān)資料,BigInteger是Java中用于表示任意精度整數(shù)的類(lèi),解決了基本數(shù)據(jù)類(lèi)型精度限制問(wèn)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Java中反射reflect的基礎(chǔ)知識(shí)講解
這篇文章主要介紹了Java中反射reflect的基礎(chǔ)知識(shí)講解,Java中的反射,它算是Java當(dāng)中非常底層的一個(gè)技術(shù),平時(shí)我們我們用得不多,實(shí)際上它也的確非常復(fù)雜同時(shí)也難以理解,但是涉及到底層的東西Java都給我們封裝好了,我們直接拿來(lái)調(diào)用即可,需要的朋友可以參考下2023-10-10
如何在Spring Boot項(xiàng)目中集成MQTT協(xié)議
本文介紹在SpringBoot中集成MQTT的步驟,包括安裝Broker、添加Eclipse Paho依賴(lài)、配置連接參數(shù)、實(shí)現(xiàn)消息發(fā)布訂閱、測(cè)試接口及注意事項(xiàng),如唯一客戶(hù)端ID、安全措施等,幫助開(kāi)發(fā)者快速實(shí)現(xiàn)物聯(lián)網(wǎng)通信,感興趣的朋友一起看看吧2025-06-06
Java對(duì)象比較之equals與hashCode詳解
這篇文章主要介紹了Java對(duì)象比較之equals與hashCode詳解,equals?方法和?hashCode?方法是?Object?類(lèi)中的兩個(gè)基礎(chǔ)方法,它們共同協(xié)作來(lái)判斷兩個(gè)對(duì)象是否相等,需要的朋友可以參考下2023-12-12
Java static關(guān)鍵字詳細(xì)介紹與用法總結(jié)
這篇文章主要介紹了Java中static關(guān)鍵字的作用和用法詳細(xì)介紹,主要講了靜態(tài)方法、靜態(tài)變量、靜態(tài)類(lèi)、static和final一塊用等內(nèi)容。需要的朋友可以參考下2017-04-04
springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描
這篇文章主要介紹了springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
windows上nacos自啟動(dòng)的三種方法小結(jié)
本文主要給大家介紹了windows上nacos自啟動(dòng)的三種方法,借助WinSW.exe添加到服務(wù)列表,修改nacos啟動(dòng)配置以及以開(kāi)機(jī)"啟動(dòng)"方式——啟動(dòng)Nacos的startup.cmd這三種方法,文中通過(guò)圖文講解的非常詳細(xì),需要的朋友可以參考下2023-12-12

