跳了一次JAVA泛型擦除的坑

記錄一下今天在幫同事解決使用spring參數(shù)注入問(wèn)題的時(shí)候由于對(duì)泛型的理解不到位而遇到的坑。

如下代碼所示:


@RequestMapping(value="saveAll")

public ResponseMsg saveAll(List rules){

Rule rule=rules.get(0);    //這行代碼在測(cè)試的時(shí)候報(bào)錯(cuò)了

......

}

這段代碼的意思是使用spring的參數(shù)注入功能自動(dòng)完成將前端傳過(guò)來(lái)的數(shù)據(jù)裝載到rules變量里面渔期。

我剛開(kāi)始一直認(rèn)為這段代碼肯定是對(duì)的退客,然后就一直說(shuō)同事一定是前端傳過(guò)來(lái)的數(shù)據(jù)有錯(cuò),然后就各種檢查js矮慕,debug一步一步的查,發(fā)現(xiàn)前端傳過(guò)來(lái)的數(shù)據(jù)是正確的,后來(lái)我又想會(huì)不會(huì)是eclipse的debug功能有缺陷(原諒一個(gè)idea粉對(duì)eclipse的各種不屑)仔沿,當(dāng)然繼續(xù)被打臉,因?yàn)槲以谖译娔X上debug時(shí)數(shù)據(jù)是一樣的尺棋,rules里面的元素居然是LinkedHashMap7怙薄!看著debug顯示的數(shù)據(jù)膘螟,簡(jiǎn)直不能接受成福,我明明聲明了rules對(duì)象只能存Rules對(duì)象啊,怎么會(huì)裝其他對(duì)象>2小奴艾!

然后就真的沒(méi)轍了。内斯。我就說(shuō)這個(gè)問(wèn)題我解決不了了蕴潦,超出我認(rèn)知范圍啊,然后我們叫了一個(gè)正式員工過(guò)來(lái)幫我們看看嘿期。品擎。他開(kāi)始也是按我們的步驟排錯(cuò),后來(lái)遇到和我們一樣的問(wèn)題备徐,但是牛人終究是牛人萄传,能想出來(lái)的導(dǎo)致問(wèn)題的因素也比我們多,他說(shuō)會(huì)不會(huì)是spring不支持這種帶泛型的自動(dòng)參數(shù)裝載啊,畢竟泛型是要被擦除的秀菱。振诬。

擦除。衍菱。赶么。泛型擦除。脊串。辫呻。我靠,我終于知道是什么原因了琼锋。之前看了那么多關(guān)于泛型擦除的居然都沒(méi)有想到是這個(gè)問(wèn)題7殴搿!而且這種坑當(dāng)時(shí)也踩過(guò)缕坎,居然沒(méi)聯(lián)想起來(lái)怖侦,智商捉急。

關(guān)于泛型擦除的詳細(xì)介紹具體是什么我就不寫(xiě)在這篇文章里面了谜叹,大概就是在編譯前會(huì)執(zhí)行一系列的語(yǔ)法檢查匾寝,從而減少因?yàn)閺?qiáng)制類型轉(zhuǎn)換帶來(lái)的異常,但是編譯后的代碼是不含泛型的荷腊,會(huì)將泛型限制的元素類型給去掉艳悔。

也就是說(shuō)雖然我聲明了rules只能裝Rule類型的對(duì)象,但是代碼被編譯后很钓,這個(gè)限制就沒(méi)有了香府!因?yàn)橥ㄟ^(guò)語(yǔ)法檢查rules里的元素確實(shí)是Rule類型的對(duì)象董栽,所以并不需要在編譯后再去檢查。但是問(wèn)題來(lái)了企孩,這種檢查只能檢查一些顯式生命的對(duì)象是不是Rule類型锭碳,而java是可以通過(guò)反射來(lái)動(dòng)態(tài)的生成對(duì)象的,sprng在參數(shù)注入的時(shí)候是通過(guò)反射實(shí)現(xiàn)前端參數(shù)自動(dòng)裝載入對(duì)象的相關(guān)屬性N鹆А擒抛!

所以這樣聲明的問(wèn)題在于,由于編譯時(shí)對(duì)rules內(nèi)元素類型的限制已經(jīng)被擦除了补疑,所以spring并不知道反射成那種類型的對(duì)象歧沪,于是就默認(rèn)的用LinkedHashMap來(lái)裝載一個(gè)對(duì)象所有的屬性和值,于是rules里面的對(duì)象在運(yùn)行的時(shí)候?qū)嶋H上是LinkedHashMapA椤U锇!所以spring可能并不支持泛型參數(shù)或者需要指定其他條件才能正確的注入泛型參數(shù)(這個(gè)還沒(méi)有深究)锹杈。

至于以前踩過(guò)這方面的坑就是用Gson反序列化帶泛型的對(duì)象的時(shí)候需要額外指定一個(gè)參數(shù)來(lái)說(shuō)明集合里面的元素類型(具體的我忘了撵孤,這個(gè)有思路就好)迈着。當(dāng)時(shí)也是覺(jué)得很奇妙,為什么不做得智能一點(diǎn)自己識(shí)別邪码,我不是已經(jīng)通過(guò)泛型指定類型了么裕菠。當(dāng)時(shí)也就抱怨一下,沒(méi)有怎么多想闭专,現(xiàn)在想起來(lái)還真是too young 奴潘, too simple。影钉。

這件事讓我明白不要盲目的相信自己的經(jīng)驗(yàn)萤彩,計(jì)算機(jī)肯定是對(duì)的。經(jīng)驗(yàn)解決不了的問(wèn)題斧拍,就從原理一步一步去想雀扶,平時(shí)學(xué)的理論可能看起來(lái)沒(méi)什么用,就好像科普一樣肆汹,然而在解決一些問(wèn)題時(shí)確是一針見(jiàn)血愚墓。多聯(lián)想,發(fā)散思維才能在技術(shù)這條路上走得更遠(yuǎn)昂勉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浪册,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岗照,更是在濱河造成了極大的恐慌村象,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒至,死亡現(xiàn)場(chǎng)離奇詭異厚者,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迫吐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)库菲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人志膀,你說(shuō)我怎么就攤上這事熙宇。” “怎么了溉浙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烫止,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戳稽,道長(zhǎng)馆蠕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮荆几,結(jié)果婚禮上吓妆,老公的妹妹穿的比我還像新娘。我一直安慰自己吨铸,他們只是感情好行拢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著诞吱,像睡著了一般舟奠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上房维,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天沼瘫,我揣著相機(jī)與錄音,去河邊找鬼咙俩。 笑死耿戚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阿趁。 我是一名探鬼主播膜蛔,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脖阵!你這毒婦竟也來(lái)了皂股?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤命黔,失蹤者是張志新(化名)和其女友劉穎呜呐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悍募,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蘑辑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搜立。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片以躯。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡槐秧,死狀恐怖啄踊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刁标,我是刑警寧澤颠通,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站膀懈,受9級(jí)特大地震影響顿锰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一硼控、第九天 我趴在偏房一處隱蔽的房頂上張望刘陶。 院中可真熱鬧,春花似錦牢撼、人聲如沸匙隔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纷责。三九已至,卻和暖如春撼短,著一層夾襖步出監(jiān)牢的瞬間再膳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工曲横, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂柒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓禾嫉,卻偏偏與公主長(zhǎng)得像胳喷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夭织,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理吭露,服務(wù)發(fā)現(xiàn),斷路器尊惰,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 文章作者:Tyan博客:noahsnail.com 1. 什么是泛型 Java泛型(Generics)是JDK 5...
    SnailTyan閱讀 773評(píng)論 0 3
  • 前面讲竿,由于對(duì)泛型擦除的思考,引出了對(duì)Java-Type體系的學(xué)習(xí)弄屡。本篇题禀,就讓我們繼續(xù)對(duì)“泛型”進(jìn)行研究: JDK1...
    賈博巖閱讀 5,151評(píng)論 3 28
  • 泛型是Java 1.5引入的新特性。泛型的本質(zhì)是參數(shù)化類型膀捷,這種參數(shù)類型可以用在類迈嘹、變量、接口和方法的創(chuàng)建中全庸,分別...
    何時(shí)不晚閱讀 3,037評(píng)論 0 2
  • 如果 你不快樂(lè)秀仲, 那就出去走走。 世界這么大壶笼, 風(fēng)景很美神僵,機(jī)會(huì)很多, 人生很短覆劈,不要蜷縮在一處陰影中保礼。
    我有念念不忘的遠(yuǎn)方閱讀 114評(píng)論 0 1