java同事不寫泛型_跳了一次JAVA泛型擦除的坑

記錄一下今天在幫同事解決使用spring參數注入問題的時候由于對泛型的理解不到位而遇到的坑。

如下代碼所示:

@RequestMapping(value="saveAll")

public ResponseMsg saveAll(List rules){

Rule rule=rules.get(0); //這行代碼在測試的時候報錯了

......

}

這段代碼的意思是使用spring的參數注入功能自動完成將前端傳過來的數據裝載到rules變量里面。

我剛開始一直認為這段代碼肯定是對的,然后就一直說同事一定是前端傳過來的數據有錯,然后就各種檢查js,debug一步一步的查,發現前端傳過來的數據是正確的,后來我又想會不會是eclipse的debug功能有缺陷(原諒一個idea粉對eclipse的各種不屑),當然繼續被打臉,因為我在我電腦上debug時數據是一樣的,rules里面的元素居然是LinkedHashMap!!看著debug顯示的數據,簡直不能接受,我明明聲明了rules對象只能存Rules對象啊,怎么會裝其他對象!!

然后就真的沒轍了。。我就說這個問題我解決不了了,超出我認知范圍啊,然后我們叫了一個正式員工過來幫我們看看。。他開始也是按我們的步驟排錯,后來遇到和我們一樣的問題,但是牛人終究是牛人,能想出來的導致問題的因素也比我們多,他說會不會是spring不支持這種帶泛型的自動參數裝載啊,畢竟泛型是要被擦除的。。

擦除。。。泛型擦除。。。我靠,我終于知道是什么原因了。之前看了那么多關于泛型擦除的居然都沒有想到是這個問題!!而且這種坑當時也踩過,居然沒聯想起來,智商捉急。

關于泛型擦除的詳細介紹具體是什么我就不寫在這篇文章里面了,大概就是在編譯前會執行一系列的語法檢查,從而減少因為強制類型轉換帶來的異常,但是編譯后的代碼是不含泛型的,會將泛型限制的元素類型給去掉。

也就是說雖然我聲明了rules只能裝Rule類型的對象,但是代碼被編譯后,這個限制就沒有了!因為通過語法檢查rules里的元素確實是Rule類型的對象,所以并不需要在編譯后再去檢查。但是問題來了,這種檢查只能檢查一些顯式生命的對象是不是Rule類型,而java是可以通過反射來動態的生成對象的,sprng在參數注入的時候是通過反射實現前端參數自動裝載入對象的相關屬性!!

所以這樣聲明的問題在于,由于編譯時對rules內元素類型的限制已經被擦除了,所以spring并不知道反射成那種類型的對象,于是就默認的用LinkedHashMap來裝載一個對象所有的屬性和值,于是rules里面的對象在運行的時候實際上是LinkedHashMap!!!所以spring可能并不支持泛型參數或者需要指定其他條件才能正確的注入泛型參數(這個還沒有深究)。

至于以前踩過這方面的坑就是用Gson反序列化帶泛型的對象的時候需要額外指定一個參數來說明集合里面的元素類型(具體的我忘了,這個有思路就好)。當時也是覺得很奇妙,為什么不做得智能一點自己識別,我不是已經通過泛型指定類型了么。當時也就抱怨一下,沒有怎么多想,現在想起來還真是too young , too simple。。

這件事讓我明白不要盲目的相信自己的經驗,計算機肯定是對的。經驗解決不了的問題,就從原理一步一步去想,平時學的理論可能看起來沒什么用,就好像科普一樣,然而在解決一些問題時確是一針見血。多聯想,發散思維才能在技術這條路上走得更遠。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271852.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員職場:擁有一個學位將會在你的職業生涯中更加順利!

1、作為程序員為什么要擁有學位?很多情況下,作為程序員,學位是進入大公司的敲門磚。現在很多大的科技公司,學位是硬性要求。一般都是本科以上的學歷,甚至有的必須是碩士以上學歷。如果你的學歷達不到,基本上…

集合和數組的區別

集合和數組的區別 數組是固定長度的;集合可變長度的。 數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存儲引用數據類型。 數組存儲的元素必須是同一個數據類型;集合存儲的對象可以是不同數據類型。

程序員常見的職業病有哪些?

程序員是一個久坐的行業,基本上一天有十幾個小時需要坐在電腦旁邊,隨之而來會給我們這些廣大的程序員朋友們身體健康帶來了很大的隱患。作為一名優秀的程序員,愛護自己的身體也是非常重要的,畢竟身體是革命的本錢嘛。今天主要給大…

java文件流null_JAVA 獲取資源文件對象為NULL

今天,寫一個添加背景音樂的方法時,在導入當前文件夾下的音樂時中始終出現,以下的異常,Exception in thread "main" java.lang.NullPointerException文件存儲位置存放在當前的modlue目錄下,格式為wav.源代碼private void playBGM(){…

iOS數據持久化

TODO:數據持久化 CoreData FMDB Sqlite3 歸檔解檔 plist NSUserDefault轉載于:https://www.cnblogs.com/newhope/p/5382034.html

程序員如何快速消除自己的知識短板?

在程序員的職業生涯當中,知識短板將會是你職業生涯發展的瓶頸。只要你能夠消除這些短板,這對你的職業發展會大有裨益。本篇文章主要給大家分享一下如何解決自己工作當中的知識短板。希望對大家能有些幫助。1、關于知識短板的概念理解我個人認為所謂的知識…

HashMap默認大小和擴容后的大小

put添加的元素Entry就是數組中的元素,每個Map.Entry其實就是一個key-value對,它持有一個指向下一個元素的引用,這就構成了鏈表。 創建HashMap對象默認情況下,數組大小為16。 開始擴容的大小原來的數組大小*loadFactor。 擴容后…

swift函數

1、函數定義格式:func 函數名(形參列表) ->返回值類型{//函數體}形參列表的格式:形參名1:形參類型,形參名2:形參類型,....如:func max(nun:Int, num:Int) ->Int{return 0;}2、無返回值的…

java 解密后為空_java RSA加密解密

該工具類中用到了BASE64,需要借助第三方類庫:javabase64-1.3.1.jar注意:RSA加密明文最大長度117字節,解密要求密文最大長度為128字節,所以在加密和解密的過程中需要分塊進行。RSA加密對明文的長度是有限制的&#xff0…

程序員效率:職業倦怠的理解

作為程序員保持高效的工作效率最大的挑戰之一就是身體和心理上產生的倦怠。這個是非常常見的,比如剛開始你自己做一個新項目的時候,項目剛開始,我們總是充滿激情、精力旺盛。大多數情況隨著時間的推移,我們的激情慢慢減退&#xf…

OnItemClickListener,OnScrollListener應用

OnItemClickListener:處理視圖中單個條目的點擊事件 OnScrollListener:監聽滾動的變化,可以用于視圖在滾動中加載數據 OnItemClickListener:實現AdapterView.OnItemClickListener接口,別忘記在MainActivity中調用listView.setOnIt…

Mysql 多實例multi_mysqld_multi多實例運行

mysqld_multi多實例運行2016-05-04 TsengYia126.com http://tsengyia.blog.chinaunix.net#################################################################系統環境:RHEL 6.7 [2.6.32-573.el6.x86_64]軟件環境:mysql-server-5.1.73-5.el6_6.x86_64m…

HashMap和ArrayList初始大小和擴容后的大小

創建HashMap對象默認情況下,數組大小為16。 開始擴容的大小原來的數組大小*loadFactor。 擴容后大小是原來的2倍,其中加載因子loadFactor的默認值為0.75,這個參數可以再創建對象時在構造方法中指定。 例如: 16*0.7512&#xf…

程序員效率:如何合理的分解任務

有這樣一句名言:要吃掉一頭大象,每次吃一口。—— 克雷頓艾布拉姆斯(Creighton Abrams)這句名言給我們的啟示就是:看起來非常艱巨的任務,不能一蹴而就,需要進行任務分解,一步一步把它…

linux安裝nagios客戶端

( 安裝到 被監控的機器上)新增用戶和組 useradd nagiosgroupadd nagcmd usermod -a -G nagcmd nagios (如果安裝中報沒有c編譯器,就 yum install gcc) 下載nagios插件 wget http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.15/nagios-plugins-1.4…

鍵值的 key 和 value 允許為null嗎

總結: HashMap對象的key、value值均可為null。HahTable對象的key、value值均不可為null。兩者的的key值均不能重復,若添加key相同的鍵值對,后面的value會自動覆蓋前面的value,但不會報錯。 例子 可以看到添加key相同的鍵值對&am…

程序員:你的業余時間是怎么被浪費掉的?

作為一名程序員如何有效的管理自己的業余時間,會成為和別人拉開差距的重要因素。當然你不能把每天的每一分鐘都充分利用起來。這個目標不可能實現。我們可以做到的是找到自己在哪一方面浪費的時間最多,然后逐漸的去消除它。如果你可以消除掉一到兩個方面…

java的rserve實現_Java 使用 Rserve 實現與 R 的通信

Rserve 是一個基于 TCP/IP 的服務器程序,它允許其他語言調用 R 語言。由于 Rserve 采用 C/S (客戶端/服務器)的調用方式,因此客戶端并不需要鏈接 R 語言庫,客戶端程序與 R 程序可以實現低耦合的目的。為調用 R 語言,需要實現一個與…

對其他組所提建議的回復(第一階段)

序號題目組名 1理財貓非常3加11.圖片的瀏覽功能我們會在第二階段完成2跑什么操running man1.我們會盡快將界面和功能整合 2.物品的分類會在后期進行中逐步完善3水騎士水騎士團隊暫無4鐵大云盤老司機1.我們的項目是可以顯示“注冊成功”的,你的建議... 2.買家賣家的聊…

數據庫文檔生成工具V1.0

??作者主頁:IT技術分享社區 ??作者簡介:大家好,我是IT技術分享社區的博主,從事C#、Java開發九年,對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽: 數據庫領域優質創作者🏆&#x…