資源描述:
《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
3、型參數(shù),會被編譯器在編譯的時候去掉。這個過程就稱為類型擦除。如在代碼中定義的List
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
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