日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java泛型extends及super區(qū)別實(shí)例解析

瀏覽:91日期:2022-08-27 13:08:33

<? extends T>和<? super T>是Java泛型中的“通配符(Wildcards)”和“邊界(Bounds)”的概念。

<? extends T>:是指“上界通配符(Upper Bounds Wildcards)” <? super T>:是指“下界通配符(Lower Bounds Wildcards)”

為什么要用通配符和邊界?

使用泛型的過程中,經(jīng)常出現(xiàn)一種很別扭的情況。比如按照題主的例子,我們有Fruit類,和它的派生類Apple類。

class Fruit {}class Apple extends Fruit {}

然后有一個(gè)最簡單的容器:Plate類。盤子里可以放一個(gè)泛型的“東西”。我們可以對這個(gè)東西做最簡單的“放”和“取”的動(dòng)作:set( )和get( )方法。

class Plate<T>{ private T item; public Plate(T t){item=t;} public void set(T t){item=t;} public T get(){return item;}}

現(xiàn)在我定義一個(gè)“水果盤子”,邏輯上水果盤子當(dāng)然可以裝蘋果:

Plate<Fruit> pfruit=new Plate<Apple>(new Apple());

但實(shí)際上Java編譯器不允許這個(gè)操作。會(huì)報(bào)錯(cuò),“裝蘋果的盤子”無法轉(zhuǎn)換成“裝水果的盤子”。

error: incompatible types: Plate<Apple> cannot be converted to Plate<Fruit>

所以問題就來了。實(shí)際上,編譯器腦袋里認(rèn)定的邏輯是這樣的:

蘋果 IS-A 水果 裝蘋果的盤子 NOT-IS-A 裝水果的盤子

所以,就算容器里裝的東西之間有繼承關(guān)系,但容器之間是沒有繼承關(guān)系的。所以我們不可以把Plate的引用傳遞給Plate。

為了讓泛型用起來更舒服,Sun的大腦袋們就想出了<? extends T>和<? super T>的辦法,來讓”水果盤子“和”蘋果盤子“之間發(fā)生關(guān)系。

什么是上界?

下面代碼就是“上界通配符(Upper Bounds Wildcards)”:

Plate<? extends Fruit>

翻譯一下就是:一個(gè)能放水果以及一切是水果派生類的盤子。再直白點(diǎn)就是:啥水果都能放的盤子。這和我們?nèi)祟惖倪壿嬀捅容^接近了。Plate<? extends Fruit>和Plate<Apple>最大的區(qū)別就是:Plate<? extends Fruit>是Plate<Fruit>以及Plate<Apple>的基類。直接的好處就是,我們可以用“蘋果盤子”給“水果盤子”賦值了。

Plate<? extends Fruit> p=new Plate<Apple>(new Apple());

如果把Fruit和Apple的例子再擴(kuò)展一下,食物分成水果和肉類,水果有蘋果和香蕉,肉類有豬肉和牛肉,蘋果還有兩種青蘋果和紅蘋果。

//Lev 1class Food{}//Lev 2class Fruit extends Food{}class Meat extends Food{}//Lev 3class Apple extends Fruit{}class Banana extends Fruit{}class Pork extends Meat{}class Beef extends Meat{}//Lev 4class RedApple extends Apple{}class GreenApple extends Apple{}

在這個(gè)體系中,下界通配符Plate<? extends Fruit>覆蓋下圖中藍(lán)色的區(qū)域。

Java泛型extends及super區(qū)別實(shí)例解析

什么是下界?

相對應(yīng)的,“下界通配符(Lower Bounds Wildcards)”:

Plate<? super Fruit>

表達(dá)的就是相反的概念:一個(gè)能放水果以及一切是水果基類的盤子。Plate<? super Fruit>是Plate<Fruit>的基類,但不是Plate<Apple>的基類。對應(yīng)剛才那個(gè)例子,Plate<? super Fruit>覆蓋下圖中紅色的區(qū)域。

Java泛型extends及super區(qū)別實(shí)例解析

上下界通配符的副作用

邊界讓Java不同泛型之間的轉(zhuǎn)換更容易了。但不要忘記,這樣的轉(zhuǎn)換也有一定的副作用。那就是容器的部分功能可能失效。

還是以剛才的Plate為例。我們可以對盤子做兩件事,往盤子里set()新東西,以及從盤子里get()東西。

class Plate<T>{ private T item; public Plate(T t){item=t;} public void set(T t){item=t;} public T get(){return item;}}

上界<? extends T>不能往里存,只能往外取

<? extends Fruit>會(huì)使往盤子里放東西的set( )方法失效。但取東西get( )方法還有效。比如下面例子里兩個(gè)set()方法,插入Apple和Fruit都報(bào)錯(cuò):

Plate<? extends Fruit> pfruit=new Plate<Apple>(new Apple()); //不能存入任何元素pfruit.set(new Fruit()); //Errorpfruit.set(new Apple()); //Error//讀取出來的東西只能存放在Fruit或它的基類里。Fruit newFruit1=pfruit.get();Object newFruit2=pfruit.get();Apple newFruit3=pfruit.get(); //Error

原因是編譯器只知道容器內(nèi)是Fruit或者它的派生類,但具體是什么類型不知道。可能是Fruit?可能是Apple?也可能是Banana,RedApple,GreenApple?編譯器在看到后面用Plate賦值以后,盤子里沒有被標(biāo)上有“蘋果”。而是標(biāo)上一個(gè)占位符:CAP#1,來表示捕獲一個(gè)Fruit或Fruit的子類,具體是什么類不知道,代號(hào)CAP#1。然后無論是想往里插入Apple或者M(jìn)eat或者Fruit編譯器都不知道能不能和這個(gè)CAP#1匹配,所以就都不允許。

所以通配符<?>和類型參數(shù)的區(qū)別就在于:

對編譯器來說所有的T都代表同一種類型。比如下面這個(gè)泛型方法里,三個(gè)T都指代同一個(gè)類型,要么都是String,要么都是Integer。

public <T> List<T> fill(T... t);

但通配符<?>沒有這種約束,Plate<?>單純的就表示:盤子里放了一個(gè)東西,是什么我不知道。

因此為了安全起見,Plate<? extends Fruit>里什么都放不進(jìn)去。

下界<? super T>不影響往里存,但往外取只能放在Object對象里

使用下界<? super Fruit>會(huì)使從盤子里取東西的get( )方法部分失效,只能存放到Object對象里。set( )方法正常。

Plate<? super Fruit> pfruit=new Plate<Fruit>(new Fruit());//存入元素正常pfruit.set(new Fruit());pfruit.set(new Apple());//讀取出來的東西只能存放在Object類里。Apple newFruit3=pfruit.get(); //ErrorFruit newFruit1=pfruit.get(); //ErrorObject newFruit2=pfruit.get();

因?yàn)橄陆缫?guī)定了元素的最小粒度的下限,實(shí)際上是放松了容器元素的類型控制。既然元素是Fruit的基類,那往里存粒度比Fruit小的都可以。但往外讀取元素就費(fèi)勁了,只有所有類的基類Object對象才能裝下。但這樣的話,元素的類型信息就全部丟失。

PECS原則

最后看一下什么是PECS(Producer Extends Consumer Super)原則,已經(jīng)很好理解了:

頻繁往外讀取內(nèi)容的,適合用上界Extends。 經(jīng)常往里插入的,適合用下界Super。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产一二三区| 麻豆精品久久| 电影亚洲精品噜噜在线观看| 国产精品红桃| 日韩av专区| 不卡视频在线| 一区二区三区午夜视频| 日韩黄色在线观看| 国产成人1区| 91精品久久久久久久久久不卡| 亚洲精品小说| 国产午夜精品一区二区三区欧美| 亚洲欧洲日韩| 麻豆91在线播放| 欧美日韩中文一区二区| 综合激情在线| 国产一区二区精品久| 国产综合精品一区| 欧美一区二区三区久久| 日韩电影免费在线观看| 视频一区在线播放| 久久亚洲人体| 中日韩男男gay无套| 国产欧美啪啪| 亚洲一级特黄| 国产精品一区二区三区www| 激情国产在线| 日韩精品免费视频人成| 国产精品不卡| 男女性色大片免费观看一区二区| 欧美国产中文高清| 亚洲激情av| 精品一区二区三区中文字幕 | 精品精品久久| 一区福利视频| 精品国产亚洲日本| 久久国产精品99国产| 国产乱子精品一区二区在线观看 | 日韩精品免费视频人成| 肉色欧美久久久久久久免费看| 亚洲综合图色| 欧美三区四区| 国产亚洲一区二区三区啪| 日韩精品网站| 国产欧美一区二区三区国产幕精品| 色爱综合av| 国产日韩亚洲| 麻豆成人在线| 久久久久国产精品一区三寸| 国产精品一站二站| 久久午夜视频| 999国产精品视频| 老鸭窝一区二区久久精品| 免费在线视频一区| 欧美一级精品| 中文字幕在线视频网站| 欧美片第1页综合| 亚洲一区网站| 99久久婷婷| 黑人精品一区| 久久av影院| 日本a级不卡| 免费观看在线综合| 免费精品国产| 日韩电影在线视频| 国产一区二区三区网| 国产日本亚洲| 日韩在线网址| 免费一区二区视频| 欧洲激情综合| 91精品精品| 色爱av综合网| 久久精品免费一区二区三区| 韩日一区二区| 美女性感视频久久| 久久国产麻豆精品| 日本中文字幕一区二区视频| 亚洲欧美日韩国产一区| 欧美搞黄网站| 激情五月综合网| 激情久久中文字幕| 午夜av成人| 成人久久久久| 欧美aa国产视频| 欧美日韩国产传媒| 欧美亚洲激情| 91久久亚洲| 在线 亚洲欧美在线综合一区| 亚洲不卡av不卡一区二区| 精品久久视频| 97精品一区二区| 精品视频在线一区二区在线| 国产精品分类| 精品一区二区男人吃奶| 精品国产欧美日韩一区二区三区| 久久久国产精品网站| 国产一区二区三区四区五区| 高清一区二区三区| 国产 日韩 欧美一区| 久久伦理在线| 久久午夜视频| 日韩精品成人在线观看| 国产视频网站一区二区三区| 国产精品久久久免费| 老牛国内精品亚洲成av人片 | 欧美特黄一级大片| 一区久久精品| 亚洲18在线| 国产高清精品二区| 日韩成人三级| 亚洲欧洲一区二区天堂久久| 另类av一区二区| 日韩高清成人在线| 国产精品一区二区三区www| 国产一区二区三区四区五区| 久久裸体视频| 一区二区高清| 国产精品99久久免费| 日韩不卡一区| 午夜久久黄色| 亚洲精品福利| 国产精品久久久久久久久免费高清 | 高清久久一区| 在线视频观看日韩| 亚洲综合不卡| 久久精品97| 日韩成人综合| 国产免费成人| 国产精品成人**免费视频| 在线中文字幕播放| 蜜臀av在线播放一区二区三区| 国产欧美一区二区三区精品观看 | 黄色在线网站噜噜噜| 99国产精品99久久久久久粉嫩| 日韩三级精品| www.51av欧美视频| 蜜桃视频第一区免费观看| 老司机免费视频一区二区| 欧美日韩一二三四| 欧美日韩午夜电影网| 不卡一二三区| 亚洲精品成人一区| 欧美一区久久久| 天堂俺去俺来也www久久婷婷| 日本激情一区| 午夜精品影视国产一区在线麻豆| 国产传媒在线| 日韩精品社区| 欧美/亚洲一区| 嫩草伊人久久精品少妇av杨幂 | 精品中文在线| 亚洲精品乱码| 九色精品91| 国产精品va| 麻豆亚洲精品| 日韩天堂在线| 欧美国产日本| 一区二区三区四区在线观看国产日韩| 精品国产亚洲日本| 日韩一区精品| 免费精品国产的网站免费观看| 国产精品分类| 亚洲ww精品| 亚洲欧洲日本mm| 日韩精品第一区| 国产精品99精品一区二区三区∴ | 欧美特黄a级高清免费大片a级| 国产美女久久| 亚洲伊人影院| 亚洲国内欧美| 国产成人调教视频在线观看| 青草久久视频| 伊人影院久久| 久久精品国产68国产精品亚洲| 精品国产一区二| 97成人超碰| 香蕉久久久久久| 亚洲一区成人| 电影亚洲精品噜噜在线观看| 麻豆国产一区| 国产欧美三级| 欧美一区网站| 亚洲精品三级| 亚洲涩涩av| 视频一区二区三区中文字幕| 激情自拍一区| 久久三级视频| 久久婷婷亚洲| 国产亚洲一区二区手机在线观看| 久久99国产精品视频| 国产精品亚洲综合久久| 日韩精品视频网| 日本不卡一二三区黄网| 好吊日精品视频 | 午夜欧美精品| 午夜欧美精品久久久久久久| 精品欧美激情在线观看| 欧美/亚洲一区| 亚洲欧洲日本mm| 尤物精品在线|