super and extends 有何不同?

上一篇文章寫的有點(diǎn)啰嗦,http://www.itdecent.cn/p/73e86fd94448
不適合理解,這次換個(gè)角度來(lái)講,算是補(bǔ)充

java是單繼承,所有繼承的類構(gòu)成一棵樹。
假設(shè)A和B都在一顆繼承樹里(否則super,extend這些詞沒(méi)意義)。
A super B 表示A是B的父類或者祖先,在B的上面。
A extend B 表示A是B的子類或者子孫,在B下面。
由于樹這個(gè)結(jié)構(gòu)上下是不對(duì)稱的,所以這兩種表達(dá)區(qū)別很大。假設(shè)有兩個(gè)泛型寫在了函數(shù)定義里,作為函數(shù)形參(形參和實(shí)參有區(qū)別):

  1. 參數(shù)寫成:T<? super B>,對(duì)于這個(gè)泛型,?代表容器里的元素類型,由于只規(guī)定了元素必須是B的超類,導(dǎo)致元素沒(méi)有明確統(tǒng)一的“根”(除了Object這個(gè)必然的根),所以這個(gè)泛型你其實(shí)無(wú)法使用它,對(duì)吧,除了把元素強(qiáng)制轉(zhuǎn)成Object。所以,對(duì)把參數(shù)寫成這樣形態(tài)的函數(shù),你函數(shù)體內(nèi),只能對(duì)這個(gè)泛型做插入操作,而無(wú)法讀
  2. 參數(shù)寫成: T<? extends B>,由于指定了B為所有元素的“根”,你任何時(shí)候都可以安全的用B來(lái)使用容器里的元素,但是插入有問(wèn)題,由于供奉B為祖先的子樹有很多,不同子樹并不兼容,由于實(shí)參可能來(lái)自于任何一顆子樹,所以你的插入很可能破壞函數(shù)實(shí)參,所以,對(duì)這種寫法的形參,禁止做插入操作,只做讀取

作者:趙老師
鏈接:https://www.zhihu.com/question/20400700/answer/117624335
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容