這是我參與11月更文挑戰(zhàn)的第7天任内,活動(dòng)詳情查看:2021最后一次更文挑戰(zhàn)」。
茫茫人海千千萬(wàn)萬(wàn)融柬,感謝這一秒你看到這里死嗦。希望我的文章對(duì)你的有所幫助!
愿你在未來(lái)的日子粒氧,保持熱愛(ài)越除,奔赴山海!
前言:昨天我們終于講完了泛型通配符的基本使用外盯,
所以摘盆,接下來(lái)我們將會(huì)對(duì)泛型通配符的學(xué)習(xí)--泛型通配符的高級(jí)使用!
??泛型通配符
在我們之前的學(xué)習(xí)泛型的過(guò)程當(dāng)中饱苟,在當(dāng)我們使用泛型類或者接口時(shí)孩擂,傳遞的數(shù)據(jù)中,泛型類型不確定箱熬,可以通過(guò)通配符<?>表示类垦。但是一旦使用泛型的通配符后,只能使用Object類中的共性方法城须,集合中元素自身方法無(wú)法使用蚤认。
??5.2 通配符高級(jí)使用
之前設(shè)置泛型的時(shí)候,實(shí)際上是可以任意設(shè)置的糕伐,只要是類就可以設(shè)置砰琢。但是在JAVA的泛型中可以指定一個(gè)泛型的上限和下限。
泛型的上限:
格式: 類型名稱 <? extends 類 > 對(duì)象名稱
意義: 只能接收該類型及其子類
泛型的下限:
格式: 類型名稱 <? super 類 > 對(duì)象名稱
意義: 只能接收該類型及其父類型
比如:現(xiàn)已知Object類良瞧,Animal類陪汽,Dog類,Cat類褥蚯,其中Animal是Dog掩缓,Cat的父類
class Animal{}//父類
class Dog extends Animal{}//子類
class Cat extends Animal{}//子類
復(fù)制代碼
首先我們先看下,泛型的上限<? extends 類 >:
//? ? ? ? ArrayList<? extends Animal> list = new ArrayList<Object>();//報(bào)錯(cuò)
? ? ? ? ArrayList<? extends Animal> list2 = new ArrayList<Animal>();
? ? ? ? ArrayList<? extends Animal> list3 = new ArrayList<Dog>();
? ? ? ? ArrayList<? extends Animal> list4 = new ArrayList<Cat>();
復(fù)制代碼
可以看出遵岩,泛型的上限只能是該類型的類型及其子類你辣。
我們?cè)賮?lái)看看泛型的下限<? super 類 >:
? ? ? ? ArrayList<? super Animal> list5 = new ArrayList<Object>();
? ? ? ? ArrayList<? super Animal> list6 = new ArrayList<Animal>();
//? ? ? ? ArrayList<? super Animal> list7 = new ArrayList<Dog>();//報(bào)錯(cuò)
//? ? ? ? ArrayList<? super Animal> list8 = new ArrayList<Cat>();//報(bào)錯(cuò)
復(fù)制代碼
可以看出巡通,泛型的下限只能是該類型的類型及其父類。
一般泛型的上限和下限也是用來(lái)參數(shù)的傳遞:
http://www.360doc.com/content/21/1104/07/46403850_1002672849.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003191175.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003190908.shtml
再比如:現(xiàn)已知Object類舍哄,String 類宴凉,Number類,Integer類表悬,其中Number是Integer的父類
public static void main(String[] args) {
? ? Collection<Integer> list1 = new ArrayList<Integer>();
? ? Collection<String> list2 = new ArrayList<String>();
? ? Collection<Number> list3 = new ArrayList<Number>();
? ? Collection<Object> list4 = new ArrayList<Object>();
? ? getElement(list1);
? ? getElement(list2);//報(bào)錯(cuò)
? ? getElement(list3);
? ? getElement(list4);//報(bào)錯(cuò)
? ? getElement2(list1);//報(bào)錯(cuò)
? ? getElement2(list2);//報(bào)錯(cuò)
? ? getElement2(list3);
? ? getElement2(list4);
}
// 泛型的上限:此時(shí)的泛型?弥锄,必須是Number類型或者Number類型的子類
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此時(shí)的泛型?,必須是Number類型或者Number類型的父類
public static void getElement2(Collection<? super Number> coll){}
復(fù)制代碼
學(xué)到這里蟆沫,我們泛型也就學(xué)完了籽暇!
??總結(jié)
相信各位看官都對(duì)泛型有了全部的深入的了解和體驗(yàn),在平時(shí)開(kāi)發(fā)饭庞,比較常見(jiàn)使用在泛型的使用有集合框架中的List和Map戒悠。當(dāng)然還有很多的應(yīng)用,期待你慢慢發(fā)現(xiàn)舟山!
那我們繼續(xù)期待歡迎期待下一章的到來(lái)绸狐!
讓我們也一起加油吧!本人不才累盗,如有什么缺漏寒矿、錯(cuò)誤的地方,也歡迎各位人才大佬評(píng)論中批評(píng)指正若债!當(dāng)然如果這篇文章確定對(duì)你有點(diǎn)小小幫助的話符相,也請(qǐng)親切可愛(ài)的人才大佬們給個(gè)點(diǎn)贊、收藏下吧蠢琳,一鍵三連啊终,非常感謝!
https://gitee.com/numerical-control-system
https://www.thinksaas.cn/user/space/50002/
https://zhuanlan.zhihu.com/p/430534517
https://zhuanlan.zhihu.com/p/430536898
https://zhuanlan.zhihu.com/p/430537972
————————————————