我對泛型中extends和super關(guān)鍵字的理解

《Java編程思想》泛型

之前在讀《Java編程思想》中的泛型一章時(shí),對于? super MyClass為什么叫超類型通配符一直不理解哭靖,既然可以往List<? super Apple>中添加Apple的子類,那?代表的不應(yīng)該是子元素嗎欺冀,如果代表的是子元素树绩,那? extends MyClass? super MyClass有啥區(qū)別啊。今天終于從牛角尖里鉆出來了隐轩,感覺自己之前好蠢饺饭,理解能力太差,哈哈哈哈...

public class GenericTest {

    public static void main(String[] args) {
        List<? super Apple> list1 = new ArrayList<Fruit>();
        List<? super Apple> list2 = new ArrayList<Apple>();        
        // 這樣會報(bào)錯(cuò)职车,因?yàn)?代表的是Apple的父類
        List<? super Apple> list3 = new ArrayList<RedApple>();

        list2.add(new RedApple());
        // 這樣會報(bào)錯(cuò)瘫俊,因?yàn)閘ist2中的元素為Apple
        list2.add(new Fruit());

        Object obj = list1.get(0);
        // 這樣會報(bào)錯(cuò)
        Fruit fruit = list1.get(0);
        // 這樣也會報(bào)錯(cuò)
        Apple apple = list1.get(0);
        // 這樣還會報(bào)錯(cuò)
        RedApple redApple = list1.get(0);
    }

    private static class Fruit {}

    private static class Apple extends Fruit {}

    private static class RedApple extends Apple {}
}

其實(shí)List<? super Apple>的含義是指現(xiàn)有的這個(gè)容器中的元素要么是Apple,要么是Apple的父類悴灵】秆浚可以看到給List<? super Apple>賦值為ArrayList<Apple>()ArrayList<Fruit>()是沒問題的,但是賦值為ArrayList<RedApple>()就會報(bào)錯(cuò)积瞒,因?yàn)?code>RedApple是Apple的子類川尖,不符合List<? super Apple>的聲明。這樣稱super超類型通配符也就說的通了茫孔,而且Apple位于繼承樹的最底下叮喳,所以也可以稱super下界通配符
既然List<? super Apple>中的元素是AppleApple的父類缰贝,那么向List<? super Apple>中添加RedApple也是合法的馍悟,因?yàn)?code>RedApple也是Apple啊,但是添加Fruit是不行的剩晴,因?yàn)?code>List<? super Apple>中存放的元素可能為Apple锣咒。當(dāng)從List<? super Apple>中獲取元素時(shí),只能獲取到Object類型李破,因?yàn)榧偃?code>Apple為接口類型的話宠哄,那么元素的父類就不確定了,但所有的類都繼承自Object嗤攻,Object是確定的毛嫉。所以父類型通配符一般用于向一個(gè)泛型類型中“寫入”(傳遞給一個(gè)方法)。

public class GenericTest {

    public static void main(String[] args) {
        List<? extends Fruit> list1 = new ArrayList<Fruit>();
        List<? extends Fruit> list2 = new ArrayList<Apple>();
        // 這樣會報(bào)錯(cuò)妇菱,因?yàn)?代表的是Fruit的子類
        List<? extends Fruit> list3 = new ArrayList<Plant>();
        
        // 這里0索引是沒有值的哈承粤,主要是說明下extends的特性
        Fruit fruit = list2.get(0);

        // 這樣會報(bào)錯(cuò)
        list2.add(new Orange());
    }

    private static class Plant {}

    private static class Fruit extends Plant {}

    private static class Apple extends Fruit {}

    private static class Orange extends Fruit {}

}

super相反暴区,List<? extends Fruit>的含義是指現(xiàn)有的這個(gè)容器中的元素要么是Fruit,要么是Fruit的子類辛臊,所以稱extends子類型通配符仙粱,因?yàn)槿萜髦械乃性囟祭^承自Fruit,所以Fruit是所有元素的上界彻舰,也就可以稱extends上界通配符伐割。
既然List<? extends Fruit>中的元素都是Fruit的子類,那么從List<? extends Fruit>中獲取類型為Fruit的元素自然也是合法的刃唤。但是向List<? extends Fruit>中添加元素是不允許的隔心,可以看到雖然list2的引用類型為List<? extends Fruit>,看上去好像可以向其中添加Orange對象尚胞,但list2實(shí)際上是ArrayList<Apple>類型的列表硬霍,里面的元素都是Apple,而OrangeApple是沒有關(guān)系的笼裳。所以子類型通配符一般用于從一個(gè)泛型類型中“讀取”(從一個(gè)方法中返回)唯卖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市躬柬,隨后出現(xiàn)的幾起案子拜轨,更是在濱河造成了極大的恐慌,老刑警劉巖楔脯,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩轰,死亡現(xiàn)場離奇詭異,居然都是意外死亡昧廷,警方通過查閱死者的電腦和手機(jī)堪嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來木柬,“玉大人皆串,你說我怎么就攤上這事∶颊恚” “怎么了恶复?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長速挑。 經(jīng)常有香客問我谤牡,道長,這世上最難降的妖魔是什么姥宝? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任翅萤,我火速辦了婚禮,結(jié)果婚禮上腊满,老公的妹妹穿的比我還像新娘套么。我一直安慰自己培己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布胚泌。 她就那樣靜靜地躺著省咨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玷室。 梳的紋絲不亂的頭發(fā)上零蓉,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音穷缤,去河邊找鬼壁公。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绅项,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播比肄,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼快耿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芳绩?” 一聲冷哼從身側(cè)響起掀亥,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妥色,沒想到半個(gè)月后搪花,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹害,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年撮竿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔呀。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幢踏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出许师,到底是詐尸還是另有隱情房蝉,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布微渠,位于F島的核電站搭幻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逞盆。R本人自食惡果不足惜檀蹋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纳击。 院中可真熱鬧续扔,春花似錦攻臀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至识脆,卻和暖如春设联,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灼捂。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工离例, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悉稠。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓宫蛆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親的猛。 傳聞我的和親對象是個(gè)殘疾皇子耀盗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容