『Java』泛型中的PECS原則

Java編程中有時我們要用到不確定的元素,通常用通配符"?"表示蜡秽,其中" ? extends T "叫"上界通配符", " ? super T "叫"下界通配符"漩仙。

PECS原則

PECS原則的全拼是"Producer Extends Consumer Super"搓茬。
當(dāng)需要頻繁取值,而不需要寫值則使用" ? extends T "作為數(shù)據(jù)結(jié)構(gòu)泛型队他。相反卷仑,當(dāng)需要頻繁寫值,而不需要取值則使用" ? super T "作為數(shù)據(jù)結(jié)構(gòu)泛型麸折。

使用示例

創(chuàng)建Apple锡凝,F(xiàn)ruit兩個類,其中Apple是Fruit的子類垢啼,寫如下測試代碼:

public class PECS {

    ArrayList<? extends Fruit> exdentFurit;
    ArrayList<? super Fruit> superFurit;
    Apple apple = new Apple();

    private void test() {
        Fruit a1 = exdentFurit.get(0);
        Fruit a2 = superFurit.get(0); //Err1

        exdentFurit.add(apple); //Err2
        superFurit.add(apple);
    }
}

其中Err1和Err2行處報錯窜锯,因為這些操作并不符合PECS原則张肾,逐一分析:

  • Err1
    對于使用" ? super T "規(guī)定泛型的數(shù)據(jù)結(jié)構(gòu),我們只知道其存儲的值是T的父類锚扎,若以T為數(shù)據(jù)類型取值時 T t = ?吞瞪,等于將父類(?)當(dāng)做子類(T)使用,這顯然是不合理的驾孔,父類缺少子類中的一些信息芍秆,因此編譯器直接禁止在使用" ? super T "泛型的數(shù)據(jù)結(jié)構(gòu)中進行取值,只能進行寫值翠勉,正是開頭所說的CS原則妖啥。

  • Err2
    使用" ? extends T "規(guī)定泛型的數(shù)據(jù)結(jié)構(gòu),我們知道其存儲的值是T的子類对碌,T可以有多個不同表現(xiàn)的子類(多態(tài))荆虱,因此當(dāng)我們進行寫值時,我們并不知道其中存儲的到底是哪個子類俭缓,不同子類是不同的類型克伊,因此寫值操作必然會出現(xiàn)問題,所以編譯器接禁止在使用" ? extends T "泛型的數(shù)據(jù)結(jié)構(gòu)中進行寫华坦,只能進行取值愿吹,正是開頭所說的PE原則。

總結(jié)

PECS原則惜姐,就是當(dāng)時用extends做泛型時犁跪,該數(shù)據(jù)結(jié)構(gòu)作為Producer對外提供值,只能進行取值而不能寫值歹袁。
當(dāng)時用super做泛型時坷衍,該數(shù)據(jù)結(jié)構(gòu)作為Producer對外提供值,只能進行取值而不能寫值条舔。 Consumer Super


文章內(nèi)容為個人理解枫耳,如有錯誤歡迎指出。

郵箱:CodingDjz@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孟抗,一起剝皮案震驚了整個濱河市迁杨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凄硼,老刑警劉巖铅协,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摊沉,居然都是意外死亡狐史,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骏全,“玉大人苍柏,你說我怎么就攤上這事∫魑拢” “怎么了序仙?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鲁豪。 經(jīng)常有香客問我潘悼,道長,這世上最難降的妖魔是什么爬橡? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任治唤,我火速辦了婚禮,結(jié)果婚禮上糙申,老公的妹妹穿的比我還像新娘宾添。我一直安慰自己,他們只是感情好柜裸,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布缕陕。 她就那樣靜靜地躺著,像睡著了一般疙挺。 火紅的嫁衣襯著肌膚如雪扛邑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天铐然,我揣著相機與錄音蔬崩,去河邊找鬼。 笑死搀暑,一個胖子當(dāng)著我的面吹牛沥阳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播自点,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼桐罕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桂敛?” 一聲冷哼從身側(cè)響起冈绊,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠啃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟恶,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碴开,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潦牛。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡眶掌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巴碗,到底是詐尸還是另有隱情朴爬,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布橡淆,位于F島的核電站召噩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逸爵。R本人自食惡果不足惜具滴,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望师倔。 院中可真熱鬧构韵,春花似錦、人聲如沸趋艘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷胧。三九已至显拳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖单,已是汗流浹背萎攒。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矛绘,地道東北人耍休。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像货矮,于是被迫代替她去往敵國和親羊精。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348