java深度歷險之java泛型

java深度歷險之java泛型

ID:8960917

大?。?4.24 KB

頁數(shù):5頁

時間:2018-04-13

java深度歷險之java泛型_第1頁
java深度歷險之java泛型_第2頁
java深度歷險之java泛型_第3頁
java深度歷險之java泛型_第4頁
java深度歷險之java泛型_第5頁
資源描述:

《java深度歷險之java泛型》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、Java泛型(generics)是JDK5中引入的一個新特性,允許在定義類和接口的時候使用類型參數(shù)(typeparameter)。聲明的類型參數(shù)在使用時用具體的類型來替換。泛型最主要的應(yīng)用是在JDK5中的新集合類框架中。對于泛型概念的引入,開發(fā)社區(qū)的觀點是褒貶不一。從好的方面來說,泛型的引入可以解決之前的集合類框架在使用過程中通常會出現(xiàn)的運行時刻類型錯誤,因為編譯器可以在編譯時刻就發(fā)現(xiàn)很多明顯的錯誤。而從不好的地方來說,為了保證與舊有版本的兼容性,Java泛型的實現(xiàn)上存在著一些不夠優(yōu)雅的地方。當(dāng)然這也是任何有歷史的編程語言所需要承擔(dān)的歷史包袱。后續(xù)的版本更新會為早期的設(shè)計缺陷所累。??開發(fā)

2、人員在使用泛型的時候,很容易根據(jù)自己的直覺而犯一些錯誤。比如一個方法如果接收List作為形式參數(shù),那么如果嘗試將一個List的對象作為實際參數(shù)傳進(jìn)去,卻發(fā)現(xiàn)無法通過編譯。雖然從直覺上來說,Object是String的父類,這種類型轉(zhuǎn)換應(yīng)該是合理的。但是實際上這會產(chǎn)生隱含的類型轉(zhuǎn)換問題,因此編譯器直接就禁止這樣的行為。本文試圖對Java泛型做一個概括性的說明。類型擦除正確理解泛型概念的首要前提是理解類型擦除(typeerasure)。Java中的泛型基本上都是在編譯器這個層次來實現(xiàn)的。在生成的Java字節(jié)代碼中是不包含泛型中的類型信息的。使用泛型的時候加上的類

3、型參數(shù),會被編譯器在編譯的時候去掉。這個過程就稱為類型擦除。如在代碼中定義的List和List等類型,在編譯之后都會變成List。JVM看到的只是List,而由泛型附加的類型信息對JVM來說是不可見的。Java編譯器會在編譯時盡可能的發(fā)現(xiàn)可能出錯的地方,但是仍然無法避免在運行時刻出現(xiàn)類型轉(zhuǎn)換異常的情況。類型擦除也是Java的泛型實現(xiàn)方式與C++模板機制實現(xiàn)方式之間的重要區(qū)別。很多泛型的奇怪特性都與這個類型擦除的存在有關(guān),包括:·泛型類并沒有自己獨有的Class類對象。比如并不存在List.class或是List.class,

4、而只有List.class?!れo態(tài)變量是被泛型類的所有實例所共享的。對于聲明為MyClass的類,訪問其中的靜態(tài)變量的方法仍然是MyClass.myStaticVar。不管是通過newMyClass還是newMyClass創(chuàng)建的對象,都是共享一個靜態(tài)變量?!し盒偷念愋蛥?shù)不能用在Java異常處理的catch語句中。因為異常處理是由JVM在運行時刻來進(jìn)行的。由于類型信息被擦除,JVM是無法區(qū)分兩個異常類型MyException和MyException的。對于JVM來說,它們都是MyException類型的。也就無法執(zhí)行

5、與異常對應(yīng)的catch語句。類型擦除的基本過程也比較簡單,首先是找到用來替換類型參數(shù)的具體類。這個具體類一般是Object。如果指定了類型參數(shù)的上界的話,則使用這個上界。把代碼中的類型參數(shù)都替換成具體的類。同時去掉出現(xiàn)的類型聲明,即去掉<>的內(nèi)容。比如Tget()方法聲明就變成了Objectget();List就變成了List。接下來就可能需要生成一些橋接方法(bridgemethod)。這是由于擦除了類型之后的類可能缺少某些必須的方法。比如考慮下面的代碼:classMyStringimplementsComparable{publicintcompareT

6、o(Stringstr){return0;}}當(dāng)類型信息被擦除之后,上述類的聲明變成了classMyStringimplementsComparable。但是這樣的話,類MyString就會有編譯錯誤,因為沒有實現(xiàn)接口Comparable聲明的intcompareTo(Object)方法。這個時候就由編譯器來動態(tài)生成這個方法。實例分析了解了類型擦除機制之后,就會明白編譯器承擔(dān)了全部的類型檢查工作。編譯器禁止某些泛型的使用方式,正是為了確保類型的安全性。以上面提到的List和List為例來具體分析:publicvoidinspect(Listl

7、ist){for(Objectobj:list){System.out.println(obj);}list.add(1);//這個操作在當(dāng)前方法的上下文是合法的。}publicvoidtest(){Liststrs=newArrayList();inspect(strs);//編譯錯誤}?這段代碼中,inspect方法接受List作為參數(shù),當(dāng)在test方法中試圖傳入Lis

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。