Java泛型方法和類(lèi)型通配符的區(qū)別

泛型方法VS類(lèi)型通配符(兩者可以混用):

1)你會(huì)發(fā)現(xiàn)所有能用類(lèi)型通配符(?)解決的問(wèn)題都能用泛型方法解決众弓,并且泛型方法可以解決的更好:

最典型的一個(gè)例子就是:

        a. 類(lèi)型通配符:void func(List<? extends A> list);

        b. 完全可以用泛型方法完美解決:<T extends A> void func(List<T> list);

上面兩種方法可以達(dá)到相同的效果(?可以代表范圍內(nèi)任意類(lèi)型谓娃,而T也可以傳入范圍內(nèi)的任意類(lèi)型實(shí)參)滨达,并且泛型方法更進(jìn)一步俯艰,?泛型對(duì)象是只讀的,而泛型方法里的泛型對(duì)象是可修改的画株,即List<T> list中的list是可修改的@卜!

2) 要說(shuō)兩者最明顯的區(qū)別就是:

     i. ?泛型對(duì)象是只讀的续挟,不可修改充边,因?yàn)?類(lèi)型是不確定的浇冰,可以代表范圍內(nèi)任意類(lèi)型聋亡;

     ii. 而泛型方法中的泛型參數(shù)對(duì)象是可修改的,因?yàn)轭?lèi)型參數(shù)T是確定的(在調(diào)用方法時(shí)確定)漂佩,因?yàn)門(mén)可以用范圍內(nèi)任意類(lèi)型指定;

注意投蝉,前者是代表瘩缆,后者是指定,指定就是確定的意思庸娱,而代表卻不知道代表誰(shuí),可以代表范圍內(nèi)所有類(lèi)型归露;

3) 這樣好像說(shuō)的通配符?一無(wú)是處斤儿,但是并不是這樣,Java設(shè)計(jì)類(lèi)型通配符?是有道理的玄捕,首先一個(gè)最明顯的優(yōu)點(diǎn)就是?的書(shū)寫(xiě)要比泛型方法簡(jiǎn)潔枚粘,無(wú)需先聲明類(lèi)型參數(shù)飘蚯,其次它們有各自的應(yīng)用場(chǎng)景:

i. 一般只讀就用?,要修改就用泛型方法攀圈,例如一個(gè)進(jìn)行修改的典型的泛型方法的例子:

  public <T> void func(List<T> list, T t) {
    
       list.add(t);
    
       }

ii. 在多個(gè)參數(shù)峦甩、返回值之間存在類(lèi)型依賴(lài)關(guān)系就應(yīng)該使用泛型方法凯傲,否則就應(yīng)該是通配符?:

具體講就是,如果一個(gè)方法的返回值幌缝、某些參數(shù)的類(lèi)型依賴(lài)另一個(gè)參數(shù)的類(lèi)型就應(yīng)該使用泛型方法诫欠,因?yàn)楸灰蕾?lài)的類(lèi)型如果是不確定的?浴栽,那么其他元素就無(wú)法依賴(lài)它)典鸡,例如:<T> void func(List<? extends T> list, T t); 即第一個(gè)參數(shù)依賴(lài)第二個(gè)參數(shù)的類(lèi)型(第一個(gè)參數(shù)list的類(lèi)型參數(shù)必須是第二個(gè)參數(shù)的類(lèi)型或者其子類(lèi))椿每;

可以看到英遭,Java支持泛型方法和' ? '混用;

這個(gè)方法也可以寫(xiě)成:<T, E extends T> void func(List<E> list, T t); // 明顯意義是一樣的汁尺,只不過(guò)這個(gè)list可以修改多律,而上一個(gè)list無(wú)法修改。
總之就是一旦返回值辽装、形參之間存在類(lèi)型依賴(lài)關(guān)系就只能使用泛型方法拾积;
否則就應(yīng)該使用' ? '

4) 對(duì)泛型方法的類(lèi)型參數(shù)進(jìn)行規(guī)約:即有時(shí)候可能不必使用泛型方法的地方你不小心麻煩地寫(xiě)成了泛型方法丰涉,而此時(shí)你可以將其規(guī)約成使用?的最簡(jiǎn)形式

     i. 總結(jié)地來(lái)講就是一句話(huà):只出現(xiàn)一次 & 對(duì)它沒(méi)有任何依賴(lài)

     ii. 例如:<T, E extends T> void func(List<T> l1, List<E> l2);  // 這里E只在形參中出現(xiàn)了一次(類(lèi)型參數(shù)聲明不算),并且沒(méi)有任何其他東西(方法形參肛度、返回值)依賴(lài)它承耿,那么就可以把E規(guī)約成?

N泵骸!最終規(guī)約的結(jié)果就是:<T> void func(List<T> l1, List<? extends T> l2);

5) 一個(gè)最典型的應(yīng)用就是容器賦值方法(Java的API):public static <T> void Collections.copy(List<T> dest, List<? extends T> src) { ... }

K蟆蝙砌!從src拷貝到dest,那么dest最好是src的類(lèi)型或者其父類(lèi)择克,因?yàn)檫@樣才能類(lèi)型兼容,并且src只是讀取壹堰,沒(méi)必要做修改贱纠,因此使用?還可以強(qiáng)制避免你對(duì)src做不必要的修改响蕴,增加的安全性
————————————————
版權(quán)聲明:本文為CSDN博主「tom和cat」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議辖试,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明劈狐。
原文鏈接:https://blog.csdn.net/sinat_32023305/article/details/83215751

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肥缔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怒见,更是在濱河造成了極大的恐慌姑宽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舵变,死亡現(xiàn)場(chǎng)離奇詭異纪隙,居然都是意外死亡扛或,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)艾恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)麸锉,“玉大人,你說(shuō)我怎么就攤上這事花沉。” “怎么了磷脯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵争拐,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我架曹,道長(zhǎng)闹瞧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任万牺,我火速辦了婚禮洽腺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘核无。我一直安慰自己团南,他們只是感情好炼彪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拷橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萄唇。 梳的紋絲不亂的頭發(fā)上赌厅,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天特愿,我揣著相機(jī)與錄音勾缭,去河邊找鬼俩由。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幻梯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咬摇,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肛鹏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼恩沛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雷客,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搅裙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后好爬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體存炮,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年宫盔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灼芭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彼绷,死狀恐怖寄悯,靈堂內(nèi)的尸體忽然破棺而出堕义,到底是詐尸還是另有隱情,我是刑警寧澤倦卖,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站秘遏,受9級(jí)特大地震影響嘉竟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舍扰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一边苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧个束,春花似錦、人聲如沸茬底。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涉馁。三九已至,卻和暖如春寒随,著一層夾襖步出監(jiān)牢的瞬間帮坚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蒲讯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灰署,地道東北人溉箕。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓肴茄,卻偏偏與公主長(zhǎng)得像但指,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棋凳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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