Java 中super T和extends T的區(qū)別是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
和縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
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>();
讀取操作通過以上給定的賦值語句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你可以讀取到Number,因為以上的列表要么包含 Number元素,要么包含Number的類元素。你不能保證讀取到Integer,因為foo3可能指向的是List
寫入操作過以上給定的賦值語句,你能把一個什么類型的元素合法地插入到foo3中呢?你不能插入一個Integer元素,因為foo3可能指向 List
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
讀取操作通過以上給定的賦值語句,你一定能從foo3列表中讀取到的元素的類型是什么呢?你不能保證讀取到Integer,因為foo3可能指向 List
寫入操作通過以上給定的賦值語句,你能把一個什么類型的元素合法地插入到foo3中呢?你可以插入Integer對象,因為上述聲明的列表都支持 Integer。你可以插入Integer的子類的對象,因為Integer的子類同時也是Integer,原因同上。你不能插入Double對象,因為 foo3可能指向ArrayList
PECS
請記住PECS原則:生產(chǎn)者(Producer)使用extends,消費者(Consumer)使用super。
生產(chǎn)者使用extends
如果你需要一個列表提供T類型的元素(即你想從列表中讀取T類型的元素),你需要把這個列表聲明成< extends T>,比如List< extends Integer>,因此你不能往該列表中添加任何元素。
消費者使用super
如果需要一個列表使用T類型的元素(即你想把T類型的元素加入到列表中),你需要把這個列表聲明成< super T>,比如List< super Integer>,因此你不能保證從中讀取到的元素的類型。
即是生產(chǎn)者,也是消費者
如果一個列表即要生產(chǎn),又要消費,你不能使用泛型通配符聲明列表,比如List
例子
請參考java.util.Collections里的copy方法(JDK1.7):
看完上述內(nèi)容,你們掌握Java 中super T和extends T的區(qū)別是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!