天天看點

Java Reflection(九):泛型

内容索引

<a href="http://ifeve.com/java-reflection-9-generics/#thegenericreflectionruleofthumb">運用泛型反射的經驗法則</a>

<a href="http://ifeve.com/java-reflection-9-generics/#genericmethodreturntyps">泛型方法傳回類型</a>

<a href="http://ifeve.com/java-reflection-9-generics/#genericmethodparmtypes">泛型方法參數類型</a>

<a href="http://ifeve.com/java-reflection-9-generics/#genericfieldtyps">泛型變量類型</a>

我常常在一些文章以及論壇中讀到說java泛型資訊在編譯期被擦除(erased)是以你無法在運作期獲得有關泛型的資訊。其實這種說法并不完全正确的,在一些情況下是可以在運作期擷取到泛型的資訊。這些情況其實覆寫了一些我們需要泛型資訊的需求。在本節中我們會示範一下這些情況。

<a></a>

下面是兩個典型的使用泛型的場景:

1、聲明一個需要被參數化(parameterizable)的類/接口。

2、使用一個參數化類。

當你聲明一個類或者接口的時候你可以指明這個類或接口可以被參數化,java.util.list接口就是典型的例子。你可以運用泛型機制建立一個标明存儲的是string類型list,這樣比你建立一個object的list要更好。

當你想在運作期參數化類型本身,比如你想檢查java.util.list類的參數化類型,你是沒有辦法能知道他具體的參數化類型是什麼。這樣一來這個類型就可以是一個應用中所有的類型。但是,當你檢查一個使用了被參數化的類型的變量或者方法,你可以獲得這個被參數化類型的具體參數。總之:

你不能在運作期獲知一個被參數化的類型的具體參數類型是什麼,但是你可以在用到這個被參數化類型的方法以及變量中找到他們,換句話說就是獲知他們具體的參數化類型。

在下面的段落中會向你示範這類情況。

我們可以擷取getstringlist()方法的泛型傳回類型,換句話說,我們可以檢測到getstringlist()方法傳回的是list而不僅僅隻是一個list。如下例:

這段代碼會列印出 “typeargclass = java.lang.string”,type[]數組typearguments隻有一個結果 – 一個代表java.lang.string的class類的執行個體。class類實作了type接口。

你同樣可以通過反射來擷取方法參數的泛型類型,下面這個例子定義了一個類,這個類中的方法的參數是一個被參數化的list:

你可以像這樣來擷取方法的泛型參數:

這段代碼會列印出”parameterargtype = java.lang.string”。type[]數組parameterargtypes隻有一個結果 – 一個代表java.lang.string的class類的執行個體。class類實作了type接口。

這段代碼會列印出”fieldargclass = java.lang.string”。type[]數組fieldargclass隻有一個結果 – 一個代表java.lang.string的class類的執行個體。class類實作了type接口。