泛型疑點(diǎn)

ArrayList是一個(gè)使用泛型的類,它的類聲明如下:

public class ArrayList<E> extends AbstractList<E> implement List<E> ...{
      public boolean add(E o)...
}

當(dāng)我們定義一個(gè)方法如下:

public void takeAnimal(ArrayList<Animal> animals){
      ...
}

當(dāng)我定義個(gè)實(shí)例對(duì)象 ArrayList<Animal> animals = new ArrayList<Animal>() 然后使用 takeAnimal(animals) 來調(diào)用我們定義的方法漓帚,編譯并運(yùn)行程序母债,程序能夠正常運(yùn)行;
??重新實(shí)驗(yàn)尝抖,當(dāng)我創(chuàng)建一個(gè) Animal 的子類 Cat 的實(shí)例對(duì)象毡们,例如 ArrayList<Cat> cats = new ArrayList<Cat>(),然后我們?cè)偈褂?takeAnimal(cats) 來調(diào)用之前定義的方法昧辽,編譯衙熔,這個(gè)時(shí)候程序會(huì)報(bào)錯(cuò),錯(cuò)誤大致如下:

java.util.ArrayList<Animal> cannot be applied to java.utils.arrayList<Dog>

** Cat 明明為 Animal 的子類搅荞,為什么不能作為參數(shù)傳遞呢红氯?**
??理由其實(shí)簡(jiǎn)單,根據(jù)Java面向?qū)ο蟮奶匦怨就础T囅胂肓「剩绻诜椒▋?nèi)我添加Animal其他子類的對(duì)象怎么辦,例如:我們添加 Animal 的另一子類 Dog 茉贡,代碼如下:

public void takeAnimal(ArrayList<Animal> animals){
      animals.add(new Dog);
}

此時(shí) animals 引用實(shí)際上持有的是ArrayList<Cat> 對(duì)象塞栅,而 CatDog 雖然擁有同一父類,但它們之間并沒有 is-a 或者 has-a 關(guān)系腔丧,因此 Dog 不能添加到 animal 中放椰。而在這個(gè)方法中 animals.add(new Dog); 確實(shí)在語法上沒有錯(cuò)誤,Java 為了避免這個(gè)問題愉粤,在編譯時(shí)就會(huì)提示之前的錯(cuò)誤砾医。

那么我們是不是要為每一個(gè)類的 ArrayList 參數(shù)定義一個(gè)方法呢??
??答案是不用R吕濉H缪痢!Java 為我們提供了一個(gè)方案:使用泛型與萬用字符。例如我們重寫方法

public void takeAnimals(ArrayList<? extends Animal> animals){
      ...
}

或者

public <T extends Animal> void takeAnimals(ArrayList<T> animals){
      ...
}

使用上述方法后我們使用 takeAnimal(cats) 來調(diào)用方法就不會(huì)報(bào)錯(cuò)了错邦,但是有一個(gè)問題需要注意涎显,在該方法體中不會(huì)允許你向 animals 添加任何元素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兴猩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子早歇,更是在濱河造成了極大的恐慌倾芝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭跳,死亡現(xiàn)場(chǎng)離奇詭異晨另,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谱姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門借尿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屉来,你說我怎么就攤上這事路翻。” “怎么了茄靠?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵茂契,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我慨绳,道長(zhǎng)掉冶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任脐雪,我火速辦了婚禮厌小,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘战秋。我一直安慰自己璧亚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布获询。 她就那樣靜靜地躺著涨岁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉嚣。 梳的紋絲不亂的頭發(fā)上梢薪,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音尝哆,去河邊找鬼秉撇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琐馆。 我是一名探鬼主播规阀,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瘦麸!你這毒婦竟也來了谁撼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤滋饲,失蹤者是張志新(化名)和其女友劉穎厉碟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屠缭,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箍鼓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呵曹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片款咖。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奄喂,靈堂內(nèi)的尸體忽然破棺而出铐殃,到底是詐尸還是另有隱情,我是刑警寧澤跨新,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布背稼,位于F島的核電站,受9級(jí)特大地震影響玻蝌,放射性物質(zhì)發(fā)生泄漏蟹肘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一俯树、第九天 我趴在偏房一處隱蔽的房頂上張望帘腹。 院中可真熱鬧,春花似錦许饿、人聲如沸阳欲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球化。三九已至,卻和暖如春瓦糟,著一層夾襖步出監(jiān)牢的瞬間筒愚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工菩浙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巢掺,地道東北人句伶。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像陆淀,于是被迫代替她去往敵國(guó)和親考余。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 2014年的蘋果全球開發(fā)者大會(huì)(WWDC)轧苫,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,295評(píng)論 0 9
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法楚堤,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,235評(píng)論 0 2
  • 面向?qū)ο笾饕槍?duì)面向過程。 面向過程的基本單元是函數(shù)含懊。 什么是對(duì)象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,059評(píng)論 0 4
  • 為什么需要泛型钾军? 通過泛型可以定義類型安全的數(shù)據(jù)結(jié)構(gòu),而無須使用實(shí)際的數(shù)據(jù)類型(可擴(kuò)展)绢要。這能夠顯著提高性能并得到...
    一只好奇的茂閱讀 1,264評(píng)論 2 39
  • 以下自定義命令中 *** C:\Program Files\TortoiseSVN\bin\ *** 為 **...
    小歆Pro閱讀 1,217評(píng)論 0 1