JAVA中的協(xié)變和逆變

協(xié)變逆變的概念

可變性是以一種類型安全的方式道宅,將一個對象當(dāng)做另一個對象來使用萧豆。如果不能將一個類型替換成為另一個類型臼朗,那么這個類型就稱之為:不變量。

協(xié)變:如果某個返回的類型可以由其派生類替換蝎土,那么這個類型就是支持協(xié)變的视哑。

逆變:如果某個參數(shù)類型可以由其基類替換,那么這個類就是支持逆變的誊涯。

如Function, 在這里R?作為函數(shù)的返回值, 所以這個泛型要協(xié)變, 而T用在函數(shù)的參數(shù)上所以要用逆變挡毅。

Function<? super Dog,? extends Animal> f1;

協(xié)變

如:List<Number>和List<Integer>之間是沒有繼承關(guān)系的。

但是直觀上會覺得,Integer是Number的子類, 所以List<Integer>應(yīng)是List<Number>的子類暴构。

如果想要這種效果, 就要用協(xié)變跪呈。

List<? extends Number>這樣List<Integer>就能成為List 子類, 也就是可以賦值。

List<Integer>b = new ArrayList<>();

List<? extends Number> a = b;?

逆變

假設(shè)有以下繼承關(guān)系:

車 > 轎車 > 標(biāo)準(zhǔn)轎車 > 高級轎車

現(xiàn)在有一個人聲稱自己能修理所有的標(biāo)準(zhǔn)轎車, 所以發(fā)出了以下公告:

修理(List<標(biāo)準(zhǔn)轎車> cars)

假設(shè)我現(xiàn)在有List<轎車>和 List<高級轎車>

那么這個人到底能修理哪個呢? 從上面的函數(shù)聲明來看都不可以.

再來看看這個人的聲明

他說能夠修理所有標(biāo)準(zhǔn)轎車

那么因為標(biāo)準(zhǔn)轎車擴(kuò)展了轎車, 所以如果能夠修理標(biāo)準(zhǔn)轎車, 那么應(yīng)當(dāng)可以修理轎車

所以這個函數(shù)應(yīng)當(dāng)可以接受所有標(biāo)準(zhǔn)轎車的父類

也就是說 List<轎車> 能夠傳入 以List<標(biāo)準(zhǔn)轎車>為參數(shù)的函數(shù)

換句話說 List<轎車> 是List<標(biāo)準(zhǔn)轎車>的子類, 這樣才能傳入?yún)?shù)

所以上面的公告要用逆變, 改成如下:

修理(List<? super 標(biāo)準(zhǔn)轎車> cars)

設(shè)計模式

里氏替換原則:的內(nèi)容可以描述為: “派生類(子類)對象可以在程式中代替其基類(超類)對象取逾『穆蹋”

墨子的智慧

《墨子:小取》中說,“白馬砾隅,馬也误阻;乘白馬,乘馬也。驪馬究反,馬也寻定;乘驪馬,乘馬也”精耐。文中的驪馬是黑的馬狼速。意思就是白馬和黑馬都是馬,乘白馬或者乘黑馬就是乘馬卦停。在面向?qū)ο笾形覀兛梢赃@樣理解向胡,馬是一個父類,白馬和黑馬都是馬的子類沫浆,我們說乘馬是沒有問題的捷枯,那么我們把父類換成具體的子類,也就是乘白馬和乘黑馬也是沒有問題的专执,這就是我們上邊說的里氏替換原則淮捆。

墨子同時還指出了反過來是不能成立的”竟桑《墨子:小取》中說:“娣攀痊,美人也,愛娣拄显,非愛美人也”苟径。娣是指妹妹,也就是說我的妹妹是沒人躬审,我愛我的妹妹(出于兄妹感情)棘街,但是不等于我愛美人。在面向?qū)ο罄锞褪浅斜撸廊耸且粋€父類遭殉,妹妹是美人的一個子類。哥哥作為一個類有“喜愛()”方法博助,可以接受妹妹作為參量险污。那么這個“喜愛()”不能接受美人類的實例,這也就說明了反過來是不能成立的富岳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛔糯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窖式,更是在濱河造成了極大的恐慌蚁飒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖镀,死亡現(xiàn)場離奇詭異飒箭,居然都是意外死亡狼电,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門弦蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肩碟,“玉大人,你說我怎么就攤上這事凸椿∠髌恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵脑漫,是天一觀的道長髓抑。 經(jīng)常有香客問我,道長优幸,這世上最難降的妖魔是什么吨拍? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮网杆,結(jié)果婚禮上羹饰,老公的妹妹穿的比我還像新娘。我一直安慰自己碳却,他們只是感情好队秩,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昼浦,像睡著了一般馍资。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上关噪,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天鸟蟹,我揣著相機(jī)與錄音,去河邊找鬼使兔。 笑死戏锹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火诸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼荠察,長吁一口氣:“原來是場噩夢啊……” “哼置蜀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悉盆,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盯荤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后焕盟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秋秤,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灼卢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍哎。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鞋真,靈堂內(nèi)的尸體忽然破棺而出崇堰,到底是詐尸還是另有隱情,我是刑警寧澤涩咖,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布海诲,位于F島的核電站,受9級特大地震影響檩互,放射性物質(zhì)發(fā)生泄漏特幔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一闸昨、第九天 我趴在偏房一處隱蔽的房頂上張望蚯斯。 院中可真熱鬧,春花似錦零院、人聲如沸溉跃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撰茎。三九已至,卻和暖如春打洼,著一層夾襖步出監(jiān)牢的瞬間龄糊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工募疮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留炫惩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓阿浓,卻偏偏與公主長得像他嚷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芭毙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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