Java獲取泛型T的類型 T.class
Java如何優雅獲取泛型類型
1.學習之前我們先來了解一些泛型的術語
<>: 念做typeof
List<E>: E稱為類型參數變量
ArrayList<Integer>: Integer稱為實際類型參數
ArrayList<Integer>: 整個ArrayList<Integer>稱為參數化類型(對應着java.lang.reflect.ParameterizedType接口)
2.泛型反射相關API
Type[] getGenericInterfaces():獲得當前類實現的泛型接口(參數化類型)
舉例1:
1)定義類A,C 接口B
//類B
public interface B{}
//類C
public class C{}
//A實現B,向B傳入實際類型參數C
public class A implements B<C>{}
2)測試代碼
A a = new A();
Type[] types = a.getClass().getGenericInterfaces();
for (Type type : types) {System.out.println(type);//結果是:B<C>
}
Type[] getGenericSuperclass():獲得帶有泛型的父類
舉例2:
1)定義3個類A,B,C
//類B
public class B{}
//類C
public class C{}
//A繼承B,向B傳入實際類型參數C
public class A extends B<C>{}
2)測試代碼
A a = new A();
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//結果是:B<C>
ParameterizedType:參數化類型接口,Type的子接口
通過上面兩個案例可知getGenericInterfaces和getGenericSuperclass可以獲取到參數化類型B<C>,並且ParameterizedType是Type的子接口,將Type強轉成ParameterizedType。ParameterizedType提供了一個getActualTypeArguments()方法,這個方法可以獲取參數化類型中的實際類型參數。
舉例3:我們對案例2測試代碼進行修改
A a = new A();
//獲得帶有泛型的父類
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//結果是:B<C>
//將type強轉成Parameterized
ParameterizedType pt = (ParameterizedType )type;
/*得到父類(參數化類型)中的泛型(實際類型參數)的實際類型。
getActualTypeArguments()返回一個Type數組,之所以返回Type數組,是因為一個類上有可能出現多個泛型,比如:Map<Integer,String>
*/
Type [] actualTypes = pt.getActualTypeArguments();
System.out.println(actualTypes[0]);//結果:C
獲取接口泛型的實際類型參數做法跟上面代碼差不多,只需要把
Type type = a.getClass().getGenericSuperclass(),改成
Type type = a.getClass().getGenericInterfaces()就可以了。
講解完畢,如有錯漏請多多包含!!!!!