泛型中extends和super的區(qū)別

extends

通配符式聲明 List<? extends Number> foo3 意味著以下每一條皆為合法語句:

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number
  1. - 若有以上聲明阎毅,則對List foo3進行讀操作時會出現(xiàn)以下情形:
    • 可以讀取Number類型的數(shù)據(jù)署驻,因為可以賦予foos的列表均包含Number類型或其子類型的數(shù)據(jù)诡挂。
    • 無法讀取Integer類型的數(shù)據(jù)凉翻,因為foo3可能指向List<Double>類型的數(shù)據(jù)蜗帜。
    • 無法讀取Double類型的數(shù)據(jù)来惧,因為foo3可能指向List<Integer>類型的數(shù)據(jù)洽蛀。
  2. - 若有以上聲明耙蔑,則對List foo3進行寫操作(add)時會出現(xiàn)以下情形:
    • 無法增添Integer類型的數(shù)據(jù)结序,因為foo3可能指向List<Double>類型的數(shù)據(jù)。
    • 無法增添Double類型的數(shù)據(jù)纵潦,因為foo3可能指向List<Integer>類型的數(shù)據(jù)徐鹤。
    • 無法增添Number類型的數(shù)據(jù)垃环,因為foo3可能指向List<Integer>類型的數(shù)據(jù)。

無法向List<? extends T>添加任何對象返敬,因為無法保證變量具體指向的是什么類型的List遂庄,從而無法保證目標(biāo)List允許添加何種類型的對象。唯一能保證的是可以從中讀出一個T類型或其子類型的數(shù)據(jù)劲赠。

super

List <? super T>.

通配符式聲明 List<? super Integer> foo3 意味著以下每一條皆為合法語句:

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer
  1. - 若有以上聲明涛目,則對List foo3進行讀操作時會出現(xiàn)以下情形:
    • 無法讀取Integer類型的數(shù)據(jù),因為foo3可能指向List<Number>List<Object>類型的數(shù)據(jù)凛澎。
    • 無法讀取Number類型的數(shù)據(jù)霹肝,因為foo3可能指向List<Object>類型的數(shù)據(jù)。
    • 只能讀取Object類型或Object子類型的數(shù)據(jù)(但無法確定是那個子類)塑煎。
  2. - 若有以上聲明沫换,則對List foo3進行寫操作(add)時會出現(xiàn)以下情形:
    • 可以增添Integer類型的數(shù)據(jù),因為示例代碼中的所有list均允許增添Integer類型的數(shù)據(jù)最铁。
    • 可以增添Integer子類型的數(shù)據(jù)讯赏,因為示例代碼中的所有list均允許增添Integer子類型的數(shù)據(jù)。
    • 無法增添Double類型的數(shù)據(jù)冷尉,因為foo3可能指向ArrayList<Integer>類型的數(shù)據(jù)漱挎。
    • 無法增添Number類型的數(shù)據(jù),因為foo3可能指向ArrayList<Integer>類型的數(shù)據(jù)雀哨。
    • 無法增添Object類型的數(shù)據(jù)磕谅,因為foo3可能指向ArrayList<Integer>類型的數(shù)據(jù)。

PECS

記住一個口訣: "Producer Extends, Consumer Super"(PECS).

  • "Producer Extends" - 如果一個List需要生產(chǎn)T類型的數(shù)據(jù)(你想要從list中讀取T類型數(shù)據(jù))雾棺,你需要將其聲明成? extends T, e.g. List<? extends Integer>膊夹。但你無法向其中增添數(shù)據(jù)。
  • "Consumer Super" - 如果你需要一個消費T類型數(shù)據(jù)的list(向其中增添T類型數(shù)據(jù))垢村,你需要將其聲明成? super T, e.g. List<? super Integer>割疾。但是你將不知道會從中讀取到何種類型的數(shù)據(jù)嚎卫。
  • 如果你需要從對List進行讀和寫操作嘉栓,則不要使用通配符式的聲明方式,e.g. List<Integer>拓诸。

===> 翻譯于StackOverflow

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侵佃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奠支,更是在濱河造成了極大的恐慌馋辈,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倍谜,死亡現(xiàn)場離奇詭異迈螟,居然都是意外死亡叉抡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門答毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥民,“玉大人,你說我怎么就攤上這事洗搂∠担” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵耘拇,是天一觀的道長撵颊。 經(jīng)常有香客問我,道長惫叛,這世上最難降的妖魔是什么倡勇? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮挣棕,結(jié)果婚禮上译隘,老公的妹妹穿的比我還像新娘。我一直安慰自己洛心,他們只是感情好固耘,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著词身,像睡著了一般厅目。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上法严,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天损敷,我揣著相機與錄音,去河邊找鬼深啤。 笑死拗馒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溯街。 我是一名探鬼主播诱桂,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呈昔!你這毒婦竟也來了挥等?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堤尾,失蹤者是張志新(化名)和其女友劉穎肝劲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡辞槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年掷漱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榄檬。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡切威,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丙号,到底是詐尸還是另有隱情先朦,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布犬缨,位于F島的核電站喳魏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怀薛。R本人自食惡果不足惜刺彩,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枝恋。 院中可真熱鬧创倔,春花似錦、人聲如沸焚碌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十电。三九已至知押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹃骂,已是汗流浹背台盯。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏线,地道東北人静盅。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像寝殴,于是被迫代替她去往敵國和親蒿叠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359