- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java 中super T和extends T的區別是什么
Java 中super T和extends T的區別是什么,相信很多沒(méi)有經(jīng)驗的人對此束手無(wú)策,為此本文總結了問(wèn)題出現的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
extends
List< extends Number> foo3的通配符聲明,意味著(zhù)以下的賦值是合法的: // 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列表中讀取到的元素的類(lèi)型是什么呢?你可以讀取到Number,因為以上的列表要么包含 Number元素,要么包含Number的類(lèi)元素。你不能保證讀取到Integer,因為foo3可能指向的是List<Double>。你 不能保證讀取到Double,因為foo3可能指向的是List<Integer>。
寫(xiě)入操作過(guò)以上給定的賦值語(yǔ)句,你能把一個(gè)什么類(lèi)型的元素合法地插入到foo3中呢?你不能插入一個(gè)Integer元素,因為foo3可能指向 List<Double>。你不能插入一個(gè)Double元素,因為foo3可能指向List<Integer>。你不能插入一個(gè) Number元素,因為foo3可能指向List<Integer>。你不能往List< extends T>中插入任何類(lèi)型的對象,因為你不能保證列表實(shí)際指向的類(lèi)型是什么,你并不能保證列表中實(shí)際存儲什么類(lèi)型的對象。***可以保證的是,你可以從中讀 取到T或者T的子類(lèi)。
super
現在考慮一下List< super T>。
List< super Integer> foo3的通配符聲明,意味著(zhù)以下賦值是合法的: // Integer is a "superclass" of Integer (in this context) List< super Integer> foo3 = new ArrayList<Integer>(); // Number is a superclass of Integer List< super Integer> foo3 = new ArrayList<Number>(); // Object is a superclass of Integer List< super Integer> foo3 = new ArrayList<Object>();
讀取操作通過(guò)以上給定的賦值語(yǔ)句,你一定能從foo3列表中讀取到的元素的類(lèi)型是什么呢?你不能保證讀取到Integer,因為foo3可能指向 List<Number>或者List<Object>。你不能保證讀取到Number,因為foo3可能指向 List<Object>。***可以保證的是,你可以讀取到Object或者Object子類(lèi)的對象(你并不知道具體的子類(lèi)是什么)。
寫(xiě)入操作通過(guò)以上給定的賦值語(yǔ)句,你能把一個(gè)什么類(lèi)型的元素合法地插入到foo3中呢?你可以插入Integer對象,因為上述聲明的列表都支持 Integer。你可以插入Integer的子類(lèi)的對象,因為Integer的子類(lèi)同時(shí)也是Integer,原因同上。你不能插入Double對象,因為 foo3可能指向ArrayList<Integer>。你不能插入Number對象,因為foo3可能指向 ArrayList<Integer>。你不能插入Object對象,因為foo3可能指向 ArrayList<Integer>。
PECS
請記住PECS原則:生產(chǎn)者(Producer)使用extends,消費者(Consumer)使用super。
生產(chǎn)者使用extends
如果你需要一個(gè)列表提供T類(lèi)型的元素(即你想從列表中讀取T類(lèi)型的元素),你需要把這個(gè)列表聲明成< extends T>,比如List< extends Integer>,因此你不能往該列表中添加任何元素。
消費者使用super
如果需要一個(gè)列表使用T類(lèi)型的元素(即你想把T類(lèi)型的元素加入到列表中),你需要把這個(gè)列表聲明成< super T>,比如List< super Integer>,因此你不能保證從中讀取到的元素的類(lèi)型。
即是生產(chǎn)者,也是消費者
如果一個(gè)列表即要生產(chǎn),又要消費,你不能使用泛型通配符聲明列表,比如List<Integer>。
例子
請參考java.util.Collections里的copy方法(JDK1.7):
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站