關(guān)于Java泛型"擦除"的一點(diǎn)思考

頭次寫博客溃列,想說的東西不難,關(guān)于泛型的疑問膛薛,是前一陣在學(xué)習(xí)jackson中遇到的听隐。

下面就把我所想到的、遇到的哄啄,分享出來雅任。

泛型是JDK1.5后的一個(gè)特性,是一個(gè)參數(shù)類型的應(yīng)用咨跌,可以將這個(gè)參數(shù)聲明在類沪么、接口、方法中锌半,就像我們方法中定義的局部變量一樣禽车;在工作中,我們常在List刊殉,Map殉摔,Set等集合對(duì)象中使用,或者我們自己聲明的類中使用记焊。

說到泛型逸月,就不得說起“擦除”這個(gè)概念,相比于c#來說亚亲,java的泛型只存在于程序的源碼中彻采,在編譯后的class文件中不存在,這個(gè)過程就是--泛型"擦除"捌归;所以肛响,對(duì)于new ArrayList<String> 和 new ArrayList<Integer> 來說,兩個(gè)對(duì)象在編譯之后兩者是一樣的惜索,通過反射均可以向集合中添加任意類型的對(duì)象特笋;

可以看到,在編譯后的class文件中,ArrayList所聲明的泛型不存在了猎物;由此可知虎囚,如果想在程序運(yùn)行期間獲取泛型,看似是一件不可能完成的事情蔫磨!

直到學(xué)習(xí)了jackson后淘讥,我發(fā)現(xiàn)java泛型的“擦除”并不能一概而論;至少通過TypeReference接口堤如,是可以獲取到對(duì)象中的泛型蒲列;


一開始學(xué)習(xí)jackson,相關(guān)的api操作還不是很熟悉搀罢,json并沒有轉(zhuǎn)換成StudentEntity對(duì)象蝗岖,而是變成了LinkedHashMap;研究后榔至,發(fā)現(xiàn)可以使用TypeReference對(duì)象抵赢,來實(shí)現(xiàn)參數(shù)化類型的json轉(zhuǎn)換;


有些疑問唧取?按照之前所說铅鲤,由于泛型“擦除”的原因,泛型在編譯后的class文件中就不存在了枫弟,只會(huì)保留原始類型(Type中的概念)彩匕,那么TypeReference又是如何實(shí)現(xiàn),獲取到了具體的泛型類型呢媒区!

查看TypeReference的源碼,發(fā)現(xiàn)在其構(gòu)造方法中掸犬,主要使用到了getGenericSuperclass()和getActualTypeArguments
()兩個(gè)方法袜漩,getGenericSuperclass()返回的是此對(duì)象帶“泛型”的父類,而getActualTypeArguments()返回的是此父類中實(shí)際類型參數(shù)的Type 對(duì)象數(shù)組湾碎,說白了就是TypeReference<>中的泛型宙攻;

通過debug,發(fā)現(xiàn)確實(shí)獲取到了new TypeReference<Map<String,StudentEntity>>中的泛型,至此我決定自己寫個(gè)父類介褥、子類座掘,看看效果如何?


再次通過debug發(fā)現(xiàn)柔滔,并沒有得到具體的泛型溢陪,而是獲取到了ParameterizedTypeImpl對(duì)象(Type中的概念);此時(shí)睛廊,對(duì)于泛型更加疑惑了形真,感覺心中有千萬只草泥馬在奔騰!

于是超全,又回過頭來看了下之前的代碼 new TypeReference<Map<String,StudentEntity>>(){}咆霜,發(fā)現(xiàn)此段代碼其實(shí)是一個(gè)匿名的內(nèi)部類邓馒,而編譯器在編譯的時(shí)候,會(huì)將此匿名內(nèi)部類單獨(dú)生成一個(gè)class文件蛾坯,命名規(guī)則如下:主類+$+(1,2,3....)


通過反編譯后光酣,真相一目了然!


創(chuàng)建的匿名內(nèi)部類new TypeReference<Map<String,StudentEntity>>(){}脉课,在生成的的class文件中救军,編譯器默認(rèn)為TypeReference中的泛型Map<String,StudentEntity>原始類型,并不會(huì)進(jìn)行擦除下翎!類似于 我們實(shí)際創(chuàng)建一個(gè)類 Class TypeReference<Map<String,StudentEntity>>{}?缤言、 Class Test<T>{}一樣,在編譯后Map视事、T依舊會(huì)存在胆萧!

由此,對(duì)于java泛型的“擦除”并不能一概而論俐东,在運(yùn)行期間跌穗,如果方法中出現(xiàn)帶泛型的匿名內(nèi)部類,那么泛型依舊會(huì)被保留下來虏辫,我們可以通過對(duì)應(yīng)的方法獲取到實(shí)際的泛型類型蚌吸!

上文中,提到的Type砌庄、原始類型的概念羹唠,在下一篇博客中提及!

最后編輯于
?著作權(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)離奇詭異扒俯,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門撼玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺姑,“玉大人,你說我怎么就攤上這事掌猛∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長只盹。 經(jīng)常有香客問我辣往,道長,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任站削,我火速辦了婚禮,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘许起。我一直安慰自己,他們只是感情好菩鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天蛛勉,我揣著相機(jī)與錄音鹿寻,去河邊找鬼。 笑死诽凌,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣诵,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了杜顺?” 一聲冷哼從身側(cè)響起疯暑,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哑舒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻馁,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洗鸵,尸身上長有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
  • 文/蒙蒙 一坯苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摇天,春花似錦粹湃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腕让,卻和暖如春孤钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背记某。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工司训, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人液南。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓壳猜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滑凉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子统扳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法畅姊,內(nèi)部類的語法咒钟,繼承相關(guān)的語法,異常的語法若未,線程的語...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 一粗合、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,261評(píng)論 0 16
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法萍嬉,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法,并非Fa...
    孫小磊閱讀 1,982評(píng)論 0 3
  • 第六章 這是一場(chǎng)服裝發(fā)布會(huì)隙疚,發(fā)布的是今年最新款的夏裝壤追,期間還有欣賞類服裝的表演。 夏季服裝輕薄透供屉,最容易探出他的取...
    霜紅秋葉閱讀 161評(píng)論 0 1
  • 那時(shí)候的人啊行冰,想法就那么質(zhì)樸簡(jiǎn)單溺蕉,可是又那么單純美好。說到這里悼做,董姨無限感慨疯特。是啊,關(guān)于愛情的表達(dá)方式贿堰,也許沉默才...
    小花fayer閱讀 508評(píng)論 0 0