Java泛型PECS法則(Effictive Java)

? extend

1   List<Apple> apples = new ArrayList<Apple>();
2   List<? extends Fruit> fruits = apples;
3   fruits.add(new Strawberry());

這次县好,代碼就編譯不過去了癞谒!Java編譯器會阻止你往一個Fruit list里加入strawberry。在編譯時我們就能檢測到錯誤蠢络,在運行時就不需要進行檢查來確保往列表里加入不兼容的類型了。即使你往list里加入Fruit對象也不行:

1   fruits.add(new Fruit());

你沒有辦法做到這些迟蜜。事實上你不能夠往一個使用了? extends的數據結構里寫入任何的值刹孔。
原因非常的簡單,你可以這樣想:這個? extends T 通配符告訴編譯器我們在處理一個類型T的子類型娜睛,但我們不知道這個子類型究竟是什么髓霞。因為沒法確定,為了保證類型安全畦戒,我們就不允許往里面加入任何這種類型的數據方库。另一方面,因為我們知道障斋,不論它是什么類型纵潦,它總是類型T的子類型,當我們在讀取數據時垃环,能確保得到的數據是一個T類型的實例:

1   Fruit get = fruits.get(0);

? super
使用 ? super 通配符一般是什么情況酪穿?讓我們先看看這個:

1   List<Fruit> fruits = new ArrayList<Fruit>();
2   List<? super Apple> = fruits;

我們看到fruits指向的是一個裝有Apple的某種超類(supertype)的List。同樣的晴裹,我們不知道究竟是什么超類,但我們知道Apple和任何Apple的子類都跟它的類型兼容救赐。既然這個未知的類型即是Apple涧团,也是GreenApple的超類,我們就可以寫入:

1   fruits.add(new Apple());
2   fruits.add(new GreenApple());

如果我們想往里面加入Apple的超類经磅,編譯器就會警告你:

1   fruits.add(new Fruit());
2   fruits.add(new Object());

因為我們不知道它是怎樣的超類泌绣,所有這樣的實例就不允許加入。
從這種形式的類型里獲取數據又是怎么樣的呢预厌?結果表明阿迈,你只能取出Object實例:因為我們不知道超類究竟是什么,編譯器唯一能保證的只是它是個Object轧叽,因為Object是任何Java類型的超類苗沧。
存取原則和PECS法則
總結 ? extends 和 the ? super 通配符的特征刊棕,我們可以得出以下結論:
如果你想從一個數據類型里獲取數據,使用 ? extends 通配符
如果你想把對象寫入一個數據結構里待逞,使用 ? super 通配符
如果你既想存甥角,又想取,那就別用通配符识樱。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末嗤无,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子怜庸,更是在濱河造成了極大的恐慌当犯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割疾,死亡現場離奇詭異嚎卫,居然都是意外死亡,警方通過查閱死者的電腦和手機杈曲,發(fā)現死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門驰凛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人担扑,你說我怎么就攤上這事恰响。” “怎么了涌献?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵胚宦,是天一觀的道長。 經常有香客問我燕垃,道長枢劝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任卜壕,我火速辦了婚禮您旁,結果婚禮上,老公的妹妹穿的比我還像新娘轴捎。我一直安慰自己鹤盒,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布侦副。 她就那樣靜靜地躺著侦锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秦驯。 梳的紋絲不亂的頭發(fā)上尺碰,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼亲桥。 笑死洛心,一個胖子當著我的面吹牛,可吹牛的內容都是我干的两曼。 我是一名探鬼主播皂甘,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悼凑!你這毒婦竟也來了偿枕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤户辫,失蹤者是張志新(化名)和其女友劉穎渐夸,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體渔欢,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡墓塌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了奥额。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苫幢。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垫挨,靈堂內的尸體忽然破棺而出韩肝,到底是詐尸還是另有隱情,我是刑警寧澤九榔,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布哀峻,位于F島的核電站,受9級特大地震影響哲泊,放射性物質發(fā)生泄漏剩蟀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一切威、第九天 我趴在偏房一處隱蔽的房頂上張望育特。 院中可真熱鬧,春花似錦先朦、人聲如沸且预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遍尺,卻和暖如春截酷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乾戏。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工迂苛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留三热,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓三幻,卻偏偏與公主長得像就漾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子念搬,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • 定義 逆變與協變用來描述類型轉換(type transformation)后的繼承關系抑堡,其定義:如果A、B表示類型...
    開發(fā)者小王閱讀 25,649評論 4 61
  • 第8章 泛型 通常情況的類和函數朗徊,我們只需要使用具體的類型即可:要么是基本類型首妖,要么是自定義的類。但是在集合類的場...
    光劍書架上的書閱讀 2,148評論 6 10
  • 前言 人生苦多爷恳,快來 Kotlin 有缆,快速學習Kotlin! 什么是Kotlin温亲? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,201評論 9 118
  • 當我睜開雙眼時栈虚,我發(fā)現我躺在一艘船上袖外,這是一艘很普通的木質船,但是當我真正向遠處望時节芥,我發(fā)現我在一片沙漠中在刺,而這艘...
    jpy1002閱讀 239評論 0 0
  • 最可怕的愛情大概是 太喜歡你以至于找不到自己 把你當成全世界以至于為了你丟掉全世界 把自己感動得一塌糊涂 以至于沒...
    再睡一分鐘閱讀 338評論 0 0