泛型(Genetic)

一幸斥、簡(jiǎn)述

jdk5以前弧满,對(duì)象保存到集合中就會(huì)失去其特性勋篓,取出時(shí)通常要程序員手工進(jìn)行類型的強(qiáng)制轉(zhuǎn)換吧享,這樣不可避免就會(huì)引發(fā)程序的一些安全性問題。jdk5中的泛型允許程序員在編寫集合代碼時(shí)譬嚣,就限制集合的處理類型钢颂,從而把原來程序運(yùn)行時(shí)可能發(fā)生問題,轉(zhuǎn)變?yōu)榫幾g時(shí)的問題孤荣,以此提高程序的可讀性和穩(wěn)定性甸陌。使用泛型時(shí)须揣,泛型類型必須為引用類型盐股,不能是基本數(shù)據(jù)類型。
注意:泛型是提供給javac編譯器使用的耻卡,它用于限定集合的輸入類型疯汁,讓編譯器在源代碼級(jí)別上,就擋住向集合中插入非法數(shù)據(jù)卵酪。但編譯器編譯完帶有泛型的Java程序后幌蚊,生成的class文件中將不再帶有泛型信息,以此使程序運(yùn)行效率不受到影響溃卡,這個(gè)過程稱之為“擦除”溢豆。

二、泛型的基本術(shù)語

以ArrayList<E>為例:<>念typeof

  • ArrayList<E>中的E稱為類型參數(shù)變量
  • ArrayList<Integer>中的Integer稱為實(shí)際類型參數(shù)
  • 整個(gè)ArrayList<E>稱為泛型類型
  • 整個(gè)ArrayList<Integer>稱為參數(shù)化的類型(ParameterizedType)

用泛型時(shí)瘸羡,如果兩邊都使用到泛型時(shí)漩仙,兩邊的泛型必須要一樣。 只用一邊也可以犹赖。如:

三队他、通配符T,E峻村,K麸折,V

定義泛型接口、泛型類粘昨、泛型方法的時(shí)候經(jīng)常會(huì)碰見不同的通配符T垢啼,E窜锯,K,V等等芭析,這些通配符表示什么意思呢衬浑?
這幾個(gè)其實(shí)沒什么區(qū)別,只不過是一個(gè)約定好的代碼放刨,也就是說使用大寫字母A工秩、B、C进统、D......X助币、Y、Z定義的螟碎,就都是泛型眉菱,把T換成A也一樣,這里T只是名字上的意義而已掉分。將T換成了A俭缓,在執(zhí)行效果上是沒有任何區(qū)別的,只不過約定好了T代表type酥郭,所以按照規(guī)范來增加了代碼的可讀性华坦。如果要定義三個(gè)或三個(gè)以上的泛型參數(shù)可以使用T1, T2, ..., Tn。

  • 不从? 表示不確定的Java類型
  • T (type) 表示具體的一個(gè)Java類型
  • K V (key value) 分別代表Java鍵值中的Key Value
  • E (element) 代表Element

四惜姐、List<T>,List<Object>椿息,List<?>區(qū)別

  • ArrayList<T> al=new ArrayList<T>(); 指定集合元素只能是T類型
  • ArrayList<?> al=new ArrayList<?>(); 集合元素可以是任意類型歹袁。這種沒有意義,一般是方法中寝优,只是為了說明用法
  • ArrayList<? extends E> al=new ArrayList<? extends E>();
    泛型的限定:
    ? extends E:接收E類型或者E的子類型条舔。
    ? super E:接收E類型或者E的父類型

注意:

  1. Object和T不同點(diǎn)在于,Object是一個(gè)實(shí)打?qū)嵉念惙Ψ]有泛指誰孟抗,而 T 可以泛指Object。
    比如public void printList(List<T> list){}方法中可以傳入List<Object> list類型參數(shù)妻熊,也可以傳入List<String> list類型參數(shù)夸浅,但是public void printList(List<Object> list){}就只允許傳入List<Object> list類型參數(shù),因?yàn)镺bject類型并沒有泛指誰扔役,是一個(gè)確定的類型帆喇。
  2. ?和T區(qū)別:? 是一個(gè)不確定類,? 和T都表示不確定的類型亿胸。但如果是T的話坯钦,函數(shù)里面可以對(duì)T進(jìn)行操作预皇,比方 T zoo = getZoo(),而不能用? zoo = getZoo()婉刀。

五吟温、T,Class<T>突颊,Class<?>區(qū)別

1??T是一種具體的類鲁豪。例如String,List律秃,Map......等等爬橡,這些都是屬于具體的類。
2??Class也是一個(gè)類棒动,但Class是存放上面String糙申,List,Map......類信息的一個(gè)類船惨,有點(diǎn)抽象柜裸。
3??Class<T>在實(shí)例化的時(shí)候,T要替換成具體類粱锐;
4??Class<?>它是個(gè)通配泛型疙挺,?可以代表任何類型,主要用于聲明時(shí)的限制情況卜范。

例如可以聲明一個(gè):

public Class<?> clazz;

而以下的聲明卻不可以衔统,因?yàn)門需要指定類型:

public Class<T> clazz;

所以當(dāng)不知道聲明什么類型的Class的時(shí)候可以定義一個(gè)Class<?>鹿榜。Class<?>可以用于參數(shù)類型定義海雪,方法返回值定義等。

六舱殿、Class<T>和Class<?>適用于什么時(shí)候呢奥裸?

使用Class<T>和Class<?>多發(fā)生在反射場(chǎng)景下。如果不使用泛型沪袭,反射創(chuàng)建一個(gè)類如下:

Teacher t = (Teacher) Class.forName("com.xxp.Teacher").newInstance();

需要強(qiáng)轉(zhuǎn)湾宙,如果反射的類型不是Teacher類,就會(huì)報(bào)java.lang.ClassCastException錯(cuò)誤冈绊。但是使用Class<T>泛型后侠鳄,不用強(qiáng)轉(zhuǎn)了。

七死宣、獲取到Class類的三種方式

1??調(diào)用 Object 類的 getClass()方法來得到Class對(duì)象伟恶,這是最常見的產(chǎn)生Class對(duì)象的方法。例如:

List list = null;
Class clazz = list.getClass();

2??使用Class類的中靜態(tài)forName()方法獲得與字符串對(duì)應(yīng)的Class對(duì)象毅该。例如:

Class clazz = Class.forName("com.xxp.Teacher");

3??如果T是一個(gè)Java類型博秫,那么T.class就代表了匹配的類對(duì)象潦牛。

Class clazz = List.class;  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挡育,隨后出現(xiàn)的幾起案子巴碗,更是在濱河造成了極大的恐慌,老刑警劉巖即寒,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡淆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡母赵,警方通過查閱死者的電腦和手機(jī)明垢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來市咽,“玉大人痊银,你說我怎么就攤上這事∈┮铮” “怎么了溯革?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谷醉。 經(jīng)常有香客問我致稀,道長(zhǎng),這世上最難降的妖魔是什么俱尼? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任抖单,我火速辦了婚禮,結(jié)果婚禮上遇八,老公的妹妹穿的比我還像新娘矛绘。我一直安慰自己,他們只是感情好刃永,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布货矮。 她就那樣靜靜地躺著,像睡著了一般斯够。 火紅的嫁衣襯著肌膚如雪囚玫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天读规,我揣著相機(jī)與錄音抓督,去河邊找鬼。 笑死束亏,一個(gè)胖子當(dāng)著我的面吹牛铃在,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枪汪,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼涌穆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怔昨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宿稀,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤趁舀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祝沸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮烹,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年罩锐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奉狈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涩惑,死狀恐怖仁期,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竭恬,我是刑警寧澤跛蛋,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站痊硕,受9級(jí)特大地震影響赊级,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岔绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一理逊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒揉,春花似錦晋被、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扁掸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最域,已是汗流浹背谴分。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镀脂,地道東北人牺蹄。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薄翅,于是被迫代替她去往敵國和親沙兰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • HMAC 加密: 注冊(cè): 1.0在注冊(cè)時(shí)獲取隨機(jī)字符串 KEY1.1 服務(wù)器保存 KEY1.2 客戶端保存 KEY...
    Heikki_閱讀 1,706評(píng)論 2 4
  • 先來一趟整體的 再重點(diǎn)寫善屬文三個(gè)字 重點(diǎn)再找了善字的楷書學(xué)習(xí),三橫間距和長(zhǎng)橫及口字間距均保持一致鼎天,寬度也保持一致...
    水石軒主人閱讀 120評(píng)論 0 0
  • 二十幾年前我出生在北方的一個(gè)小城鎮(zhèn)斋射,和全國大部分城市一樣育勺,這個(gè)地方重女輕男。 我媽是家中長(zhǎng)女罗岖,全家對(duì)我的出生抱有極...
    美牙Merry閱讀 654評(píng)論 0 0
  • 記得第一次逛簡(jiǎn)書的時(shí)候涧至,看到那些比自己小的90后,以及跟自己差不多的80后桑包,都在努力的改變自己提升自己南蓬,想到當(dāng)時(shí)自...
    冰清言心閱讀 340評(píng)論 4 3