1、? java 范型的實現原理: Java 語言中的泛型基本上完全在編譯器中實現,由編譯器執行類型檢查和類型推斷,然后生成普通的非泛型的字節碼。這種實現技術稱為擦除( erasure )(編譯器使用泛型類型信息保證類型安全,然后在生成字節碼之前將其清除),所以說其實 java 的所謂的范型知識形式上的,僅僅是在編譯期做了手腳,生成了一些標明范型的變量,應為這些都是編譯期的行為,那么引用 buaawhl 的一句話就是說: java 只能支持 Field, Method generic type 信息,這些信息存放在 class 文件的 contant pool 中,作為字符串常量出現,標志是 signature

2、? 由于 Java 范型的實現采用的是 Erasure 方式,僅僅是在編譯期進行檢查,所以在運行過程中我們就不能進行范型的實例化,因為我們不知道到底要實例化什么類型的對象,與原來我們手動進行強制類型轉換的一樣,我們如果知道我們能夠轉換成什么對象,那么我們就可以將我們知道的類型的信息傳遞過去,也就是吧 XX.class 傳遞過去,這樣 jvm 就知道我們要實例化什么樣的對象了。
?

3、? 原來 Class<T> 表示的是一個范型的 Class 類啊,為什么搞的像 List<T> 樣式的范型聲明呢?搞得我迷糊了好長時間,一致以為是一個類似容器的東西呢,這個語法感覺到有些奇怪,見笑了:),這個類一般用來接受 XX.class 返回的對象。

4、? 要想在 java 中范型用得爽,還得配合使用反射才行啊。由于 Java 采用了擦拭法進行范型的支持,所以我們依舊不能在運行期獲取到具體的類型的信息,而至能夠在我們進行設計的時候對其類型信息進行指定,那么我們指定的類型的信息就可以存放在編譯后生成的 class 文件中了,我們可以通過反射來獲取到具體的存放的信息,要獲取到動態的傳入的信息就不行了。


如下所示:

定義一個超類:
?

?

1 public ? class ?SuperClass < T? extends ?Number > ? {?
2 }
?
3

?

再定義一個子類:

import ?java.lang.reflect.ParameterizedType;?

??

public ? class ?MyTest < T > ? extends ?SuperClass < Integer > ? {?

????
private ?Class?clazz? = ? null ?;?

????
public ? void ?printClassInf() {?

???????System.?out?.println(?
this ?.getClass().getName());?

???????System.?out?.println(?
this ?.getClass().getTypeParameters()[ 0 ].getName());?

???????System.?out?.println(?
this ?.getClass().getSuperclass().getTypeParameters()[ 0 ].getName());?

???????clazz?
= (Class)?((ParameterizedType)? this ?.getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];?

???????String?out?
= ?clazz?.getName();?

???????System.?out?.println(out);?

????}
?

????
public ? static ? void ?main(String[]?args) {?

???????MyTest?test?
= ? new ?MyTest < Shit > ();?

???????test.printClassInf();?

????}
?

}
?

?


那么我們只能夠獲得我們實現定義好的要傳入到
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 理論和實踐關于范型的講解

http://www.nirvanastudio.org/java/dont-repeat-the-dao.html ? 范型實現可重用 DAO 的文章

http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/reflect/ParameterizedType.html#getActualTypeArguments()

http://buaawhl.javaeye.com/blog/22020 ? 范型的實現原理,講的比較清楚

?