1、?
java
范型的實現(xiàn)原理:
Java
語言中的泛型基本上完全在編譯器中實現(xiàn),由編譯器執(zhí)行類型檢查和類型推斷,然后生成普通的非泛型的字節(jié)碼。這種實現(xiàn)技術(shù)稱為擦除(
erasure
)(編譯器使用泛型類型信息保證類型安全,然后在生成字節(jié)碼之前將其清除),所以說其實
java
的所謂的范型知識形式上的,僅僅是在編譯期做了手腳,生成了一些標明范型的變量,應(yīng)為這些都是編譯期的行為,那么引用
buaawhl
的一句話就是說:
java
只能支持
Field, Method
的
generic type
信息,這些信息存放在
class
文件的
contant pool
中,作為字符串常量出現(xiàn),標志是
signature
。
2、?
由于
Java
范型的實現(xiàn)采用的是
Erasure
方式,僅僅是在編譯期進行檢查,所以在運行過程中我們就不能進行范型的實例化,因為我們不知道到底要實例化什么類型的對象,與原來我們手動進行強制類型轉(zhuǎn)換的一樣,我們?nèi)绻牢覀兡軌蜣D(zhuǎn)換成什么對象,那么我們就可以將我們知道的類型的信息傳遞過去,也就是吧
XX.class
傳遞過去,這樣
jvm
就知道我們要實例化什么樣的對象了。
?
3、?
原來
Class<T>
表示的是一個范型的
Class
類啊,為什么搞的像
List<T>
樣式的范型聲明呢?搞得我迷糊了好長時間,一致以為是一個類似容器的東西呢,這個語法感覺到有些奇怪,見笑了:),這個類一般用來接受
XX.class
返回的對象。
4、? 要想在 java 中范型用得爽,還得配合使用反射才行啊。由于 Java 采用了擦拭法進行范型的支持,所以我們依舊不能在運行期獲取到具體的類型的信息,而至能夠在我們進行設(shè)計的時候?qū)ζ漕愋托畔⑦M行指定,那么我們指定的類型的信息就可以存放在編譯后生成的 class 文件中了,我們可以通過反射來獲取到具體的存放的信息,要獲取到動態(tài)的傳入的信息就不行了。
如下所示:
定義一個超類:
?
?



2

3

?
再定義一個子類:









































?
那么我們只能夠獲得我們實現(xiàn)定義好的要傳入到
SuperClass
類中的
Integer
類型的范型信息,而不能得到我們在程序中傳入的
Shit
類的類型信息,因為
java
范型的信息不記錄的實例中,僅僅在類中進行了記錄(這點感覺
java
的范型還不夠成熟,可能因為要向后兼容等原因吧)。
參考資料:
http://www.duduwolf.com/wiki/2006/51.html
http://calvin.javaeye.com/blog/33139 ?? 白衣的 SpringSide 中對范型使用的說明
http://www-128.ibm.com/developerworks/cn/java/j-jtp01255.html ? Java 理論和實踐關(guān)于范型的講解
http://www.nirvanastudio.org/java/dont-repeat-the-dao.html ? 范型實現(xiàn)可重用 DAO 的文章
http://buaawhl.javaeye.com/blog/22020 ? 范型的實現(xiàn)原理,講的比較清楚