新聞中心
經(jīng)常發(fā)現(xiàn)有List< super T>、Set

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出宜良免費(fèi)做網(wǎng)站回饋大家。
extends
- List< extends Number> foo3的通配符聲明,意味著以下的賦值是合法的:
- // Number "extends" Number (in this context)
- List< extends Number> foo3 = new ArrayList< extends Number>();
- // Integer extends Number
- List< extends Number> foo3 = new ArrayList< extends Integer>();
- // Double extends Number
- List< extends Number> foo3 = new ArrayList< extends Double>();
讀取操作通過(guò)以上給定的賦值語(yǔ)句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你可以讀取到Number,因?yàn)橐陨系牧斜硪窗?Number元素,要么包含Number的類元素。你不能保證讀取到Integer,因?yàn)閒oo3可能指向的是List
。你 不能保證讀取到Double,因?yàn)閒oo3可能指向的是List 。 寫入操作過(guò)以上給定的賦值語(yǔ)句,你能把一個(gè)什么類型的元素合法地插入到foo3中呢?你不能插入一個(gè)Integer元素,因?yàn)閒oo3可能指向 List
。你不能插入一個(gè)Double元素,因?yàn)閒oo3可能指向List 。你不能插入一個(gè) Number元素,因?yàn)閒oo3可能指向List 。你不能往List< extends T>中插入任何類型的對(duì)象,因?yàn)槟悴荒鼙WC列表實(shí)際指向的類型是什么,你并不能保證列表中實(shí)際存儲(chǔ)什么類型的對(duì)象。***可以保證的是,你可以從中讀 取到T或者T的子類。
super
現(xiàn)在考慮一下List< super T>。
- List< super Integer> foo3的通配符聲明,意味著以下賦值是合法的:
- // Integer is a "superclass" of Integer (in this context)
- List< super Integer> foo3 = new ArrayList
(); - // Number is a superclass of Integer
- List< super Integer> foo3 = new ArrayList
(); - // Object is a superclass of Integer
- List< super Integer> foo3 = new ArrayList
讀取操作通過(guò)以上給定的賦值語(yǔ)句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你不能保證讀取到Integer,因?yàn)閒oo3可能指向 List
或者List 寫入操作通過(guò)以上給定的賦值語(yǔ)句,你能把一個(gè)什么類型的元素合法地插入到foo3中呢?你可以插入Integer對(duì)象,因?yàn)樯鲜雎暶鞯牧斜矶贾С?Integer。你可以插入Integer的子類的對(duì)象,因?yàn)镮nteger的子類同時(shí)也是Integer,原因同上。你不能插入Double對(duì)象,因?yàn)?foo3可能指向ArrayList
。你不能插入Number對(duì)象,因?yàn)閒oo3可能指向 ArrayList 。你不能插入Object對(duì)象,因?yàn)閒oo3可能指向 ArrayList 。
PECS
請(qǐng)記住PECS原則:生產(chǎn)者(Producer)使用extends,消費(fèi)者(Consumer)使用super。
生產(chǎn)者使用extends
如果你需要一個(gè)列表提供T類型的元素(即你想從列表中讀取T類型的元素),你需要把這個(gè)列表聲明成< extends T>,比如List< extends Integer>,因此你不能往該列表中添加任何元素。
消費(fèi)者使用super
如果需要一個(gè)列表使用T類型的元素(即你想把T類型的元素加入到列表中),你需要把這個(gè)列表聲明成< super T>,比如List< super Integer>,因此你不能保證從中讀取到的元素的類型。
即是生產(chǎn)者,也是消費(fèi)者
如果一個(gè)列表即要生產(chǎn),又要消費(fèi),你不能使用泛型通配符聲明列表,比如List
例子
請(qǐng)參考java.util.Collections里的copy方法(JDK1.7):
我們可以從Java開發(fā)團(tuán)隊(duì)的代碼中獲得到一些啟發(fā),copy方法中使用到了PECS原則,實(shí)現(xiàn)了對(duì)參數(shù)的保護(hù)。
網(wǎng)站題目:Java 泛型中super T和extends T的區(qū)別
轉(zhuǎn)載來(lái)于:http://www.5511xx.com/article/dhsjchc.html


咨詢
建站咨詢
