Java下界通配符(? super Type)的使用
在Java中,? super Type
是一個(gè)下界通配符,表示參數(shù)化類型的下限是Type
。這意味著容器可以持有Type
類型的任何對(duì)象或者Type
的父類型對(duì)象。
使用場(chǎng)景
這種類型的通配符通常用于泛型方法中,允許方法接受Type
的實(shí)例或其父類型的集合。這是基于PECS原則(Producer Extends, Consumer Super),即如果你需要一個(gè)提供(生產(chǎn))指定類型元素的集合,使用? extends
;如果你需要一個(gè)消費(fèi)(接受)指定類型元素的集合,使用? super
。
例子
假設(shè)有一個(gè)基類Animal
和兩個(gè)子類Dog
和Cat
class Animal {} class Dog extends Animal {} class Cat extends Animal {}
現(xiàn)在,我們有一個(gè)方法,它的目的是往一個(gè)集合里添加Dog
對(duì)象:
public void addDogsToList(List<? super Dog> dogs) { dogs.add(new Dog()); // 這是允許的,因?yàn)長(zhǎng)ist可以是Dog或其父類型 }
這個(gè)方法接受的參數(shù)是一個(gè)列表,這個(gè)列表的類型是Dog
或Dog
的任何父類型。因此,以下的調(diào)用都是有效的:
List<Animal> animalList = new ArrayList<>(); List<Dog> dogList = new ArrayList<>(); List<Object> objectList = new ArrayList<>(); addDogsToList(animalList); // 正確:Animal是Dog的父類型 addDogsToList(dogList); // 正確:列表的類型正好是Dog addDogsToList(objectList); // 正確:Object是所有類的父類型
在這個(gè)例子中,無(wú)論是Animal
列表、Dog
列表還是Object
列表,都可以傳遞給addDogsToList
方法,因?yàn)樗鼈兌紳M足? super Dog
的條件。這樣做的好處是,你可以將方法的使用范圍擴(kuò)展到更通用的類型,同時(shí)仍然能夠向集合中添加特定類型的元素(在本例中是Dog
)。
遍歷
使用? super Type
時(shí),遍歷集合可能會(huì)受到一些限制,因?yàn)槟悴恢兰现性氐拇_切類型。你只能確保它們是Type
或其父類的實(shí)例。在遍歷時(shí),通常需要將元素視為Type
的父類類型,這樣會(huì)丟失與Type
相關(guān)的特定信息。
例如
public void processAnimals(List<? super Animal> animals) { for(Object obj : animals) { // 因?yàn)椴淮_定List的具體類型,只能將元素當(dāng)作Object處理 // 如果需要使用Animal特有的方法或?qū)傩裕枰M(jìn)行類型轉(zhuǎn)換 if (obj instanceof Animal) { Animal animal = (Animal) obj; // 現(xiàn)在可以調(diào)用Animal類的方法 } } }
總結(jié)
? super Type
通配符的使用提高了代碼的靈活性,它允許你編寫能夠接受更廣泛類型集合的泛型方法,同時(shí)保證了向這些集合中添加元素的類型安全。這是PECS原則中的“Consumer Super”部分,適用于你的集合是消費(fèi)或接受元素的情況。在遍歷這樣的集合時(shí),通常需要將元素視為最通用的類型(如Object
),除非進(jìn)行顯式的類型轉(zhuǎn)換。
到此這篇關(guān)于Java下界通配符(? super Type)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java下界通配符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringSecurity拋出異常但AccessDeniedHandler不生效的解決
本文主要介紹了SpringSecurity拋出異常但AccessDeniedHandler不生效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01JAVA大作業(yè)之圖書管理系統(tǒng)實(shí)現(xiàn)全解
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-01-01SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)
這篇文章主要介紹了SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java獲取指定父節(jié)點(diǎn)、子節(jié)點(diǎn)的方法實(shí)現(xiàn)
在Java中,要獲取指定節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn),通常需要使用 DOM,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn)
本文主要介紹了maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享
最近做了一個(gè)在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過(guò)程記錄下來(lái)以供參考2014-01-01Springboot整合freemarker 404問(wèn)題解決方案
這篇文章主要介紹了Springboot整合freemarker 404問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05詳解Spring 基于 Aspect 注解的增強(qiáng)實(shí)現(xiàn)
本篇文章主要介紹了詳解Spring 基于 Aspect 注解的增強(qiáng)實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04