java 泛型編程簡(jiǎn)介

一塞绿、為什么需要泛型

? ? 一般的類和方法,只能使用具體的類型:要么是基本的數(shù)據(jù)類型况毅,要么是自定義的類分蓖。如果要編寫可以用于多種數(shù)據(jù)類型的代碼,這種刻板的限制對(duì)代碼的束縛就會(huì)很大尔许。


一個(gè)List類

????定義了一個(gè)List類型的集合么鹤,先向其中加入了兩個(gè)字符串類型的值,隨后加入一個(gè)Integer類型的值母债。這是完全允許的午磁,因?yàn)榇藭r(shí)list默認(rèn)的類型為Object類型。在之后的循環(huán)中毡们,由于忘記了之前在list中也加入了Integer類型的值或其他編碼原因迅皇,很容易出現(xiàn)類似于下面1中的錯(cuò)誤。因?yàn)榫幾g階段正常衙熔,而運(yùn)行時(shí)會(huì)出現(xiàn)“java.lang.ClassCastException”異常登颓。因此,導(dǎo)致此類錯(cuò)誤編碼過(guò)程中不易發(fā)現(xiàn)红氯。


java.lang.ClassCaseException

在如上的編碼過(guò)程中框咙,我們發(fā)現(xiàn)主要存在兩個(gè)問(wèn)題:

1.當(dāng)我們將一個(gè)對(duì)象放入集合中咕痛,集合不會(huì)記住此對(duì)象的類型,當(dāng)再次從集合中取出此對(duì)象時(shí)喇嘱,改對(duì)象的編譯類型變成了Object類型茉贡,但其運(yùn)行時(shí)類型任然為其本身類型。

2.因此者铜,處取出集合元素時(shí)需要人為的強(qiáng)制類型轉(zhuǎn)化到具體的目標(biāo)類型腔丧,且很容易出現(xiàn)“java.lang.ClassCastException”異常。而且人為的強(qiáng)轉(zhuǎn)也不利于代碼的復(fù)用作烟。

所以我們需要一個(gè)方法使得我們能夠保證在編譯階段代碼不出問(wèn)題愉粤,運(yùn)行階段代碼就一定不會(huì)出問(wèn)題。而這就是泛型的作用拿撩。

二.什么是泛型

????泛型衣厘,即“參數(shù)化類型”。一提到參數(shù)压恒,最熟悉的就是定義方法時(shí)有形參影暴,然后調(diào)用此方法時(shí)傳遞實(shí)參。那么參數(shù)化類型怎么理解呢涎显?顧名思義坤检,就是將類型由原來(lái)的具體的類型參數(shù)化,類似于方法中的變量參數(shù)期吓,此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參)早歇,然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)。


泛型實(shí)例

????采用泛型寫法后讨勤,想加入一個(gè)Integer類型的對(duì)象時(shí)會(huì)出現(xiàn)編譯錯(cuò)誤箭跳,通過(guò)List,直接限定了list集合中只能含有String類型的元素潭千,從而在//2處無(wú)須進(jìn)行強(qiáng)制類型轉(zhuǎn)換谱姓,因?yàn)榇藭r(shí),集合能夠記住元素的類型信息刨晴,編譯器已經(jīng)能夠確認(rèn)它是String類型了屉来。

????有很多的原因促成了泛型的出現(xiàn),而最引人注意的一個(gè)原因就是為了創(chuàng)造容器類狈癞,在我的博客有一篇討論了java容器類茄靠。容器就是存放要使用的對(duì)象的地方。數(shù)組也是如此蝶桶,但是數(shù)組能保存單一的類型慨绳,容器類與數(shù)組想比,容器類更加靈活。具備更多不同的功能脐雪。

在這里我們觀察一下List的接口定義:


List接口定義

? ? 我們可以看到厌小,在List接口中采用泛型化定義之后,中的E表示類型形參战秋,可以接收具體的類型實(shí)參璧亚,并且此接口定義中,凡是出現(xiàn)E的地方均表示相同的接受自外部的類型實(shí)參获询。

自然的涨岁,ArrayList作為L(zhǎng)ist接口的實(shí)現(xiàn)類,其定義形式是:


ArrayList實(shí)現(xiàn)

由此我們可以從源代碼的角度明白為什么上面的示例代碼會(huì)產(chǎn)生編譯錯(cuò)誤吉嚣。

三、自定義泛型接口蹬铺、泛型類和泛型方法

? ? 雖然java為我們提供了眾多的容器類尝哆,但是我們還是會(huì)在變成的過(guò)程中需要只用自定義的泛型類或者使用泛型參數(shù)。

????接口甜攀、類和方法都可以使用泛型去定義秋泄,以及相應(yīng)的使用。在具體使用時(shí)规阀,可以定義泛型接口恒序、泛型類和泛型方法。自定義泛型接口谁撼、泛型類和泛型方法與上述Java源碼中的List歧胁、ArrayList類似。


一個(gè)泛型類

這個(gè)類根據(jù)傳進(jìn)去的參數(shù)不同而生成不同的Box對(duì)象厉碟,但是無(wú)論傳進(jìn)去的是什么類型喊巍,Box都可以提供getDate的方法,這個(gè)方法不依賴具體的類型而實(shí)現(xiàn)箍鼓。從而使得這個(gè)代碼可以輕松的應(yīng)用于不同的地方崭参。

????在泛型接口、泛型類和泛型方法的定義中款咖,我們經(jīng)常使用T,E,K,V等大寫字母來(lái)代表泛型形參何暮,來(lái)接受來(lái)自己外部對(duì)使用時(shí)傳入的參數(shù)。

將上面的代碼換成下圖:



接口實(shí)例運(yùn)行結(jié)果

????在使用泛型類時(shí)铐殃,雖然傳入了不同的泛型實(shí)參海洼,但并沒(méi)有真正意義上生成不同的類型,傳入不同泛型實(shí)參的泛型類在內(nèi)存上只有一個(gè)背稼,即還是原來(lái)的最基本的類型(本實(shí)例中為Box)贰军,當(dāng)然,在邏輯上我們可以理解成多個(gè)不同的泛型類型。

????究其原因词疼,在于Java中的泛型這一概念提出的目的俯树,導(dǎo)致其只是作用于代碼編譯階段,在編譯過(guò)程中贰盗,對(duì)于正確檢驗(yàn)泛型結(jié)果后许饿,會(huì)將泛型的相關(guān)信息擦出,也就是說(shuō)舵盈,成功編譯過(guò)后的class文件中是不包含任何泛型信息的陋率。泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。

????對(duì)此總結(jié)成一句話:泛型類型在邏輯上看以看成是多個(gè)不同的類型秽晚,實(shí)際上都是相同的基本類型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓦糟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赴蝇,更是在濱河造成了極大的恐慌菩浙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句伶,死亡現(xiàn)場(chǎng)離奇詭異劲蜻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)考余,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門先嬉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人楚堤,你說(shuō)我怎么就攤上這事疫蔓。” “怎么了钾军?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鳄袍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吏恭,道長(zhǎng)拗小,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任樱哼,我火速辦了婚禮哀九,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搅幅。我一直安慰自己阅束,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布茄唐。 她就那樣靜靜地躺著息裸,像睡著了一般蝇更。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呼盆,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天年扩,我揣著相機(jī)與錄音,去河邊找鬼访圃。 笑死厨幻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腿时。 我是一名探鬼主播况脆,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼批糟!你這毒婦竟也來(lái)了格了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤徽鼎,失蹤者是張志新(化名)和其女友劉穎笆搓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纬傲,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年肤频,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹括。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宵荒,死狀恐怖汁雷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情报咳,我是刑警寧澤侠讯,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站暑刃,受9級(jí)特大地震影響厢漩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岩臣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一溜嗜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧架谎,春花似錦炸宵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春裹匙,著一層夾襖步出監(jiān)牢的瞬間瑞凑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工幻件, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拨黔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓绰沥,卻偏偏與公主長(zhǎng)得像篱蝇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徽曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 開(kāi)發(fā)人員在使用泛型的時(shí)候零截,很容易根據(jù)自己的直覺(jué)而犯一些錯(cuò)誤。比如一個(gè)方法如果接收List作為形式參數(shù)秃臣,那么如果嘗試...
    時(shí)待吾閱讀 1,054評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法涧衙,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法奥此,繼承相關(guān)的語(yǔ)法弧哎,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 在經(jīng)過(guò)一次沒(méi)有準(zhǔn)備的面試后稚虎,發(fā)現(xiàn)自己雖然寫了兩年的android代碼撤嫩,基礎(chǔ)知識(shí)卻忘的差不多了。這是程序員的大忌蠢终,沒(méi)...
    猿來(lái)如癡閱讀 2,839評(píng)論 3 10
  • 今年陽(yáng)歷的最后一個(gè)月序攘。 有天晚上,看到小貝媽發(fā)來(lái)一個(gè)鏈接寻拂,關(guān)于當(dāng)歸中醫(yī)堂的網(wǎng)上微課報(bào)名信息程奠,一年365塊,50節(jié)課...
    lindacui閱讀 245評(píng)論 0 1
  • 這是初夏的小黃家湖南岸祭钉。趁天好瞄沙,全家協(xié)力收菜籽。 這是胭脂湖沙灘泳場(chǎng)朴皆。夕陽(yáng)西下帕识,游船纜系。湖景太美遂铡,不忍離開(kāi)...
    反物質(zhì)閱讀 652評(píng)論 2 1