Java型別中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType詳解
阿新 • • 發佈:2021-12-30
和反射+泛型有關的介面型別
- java.lang.reflect.Type:java語言中所有型別的公共父介面
- java.lang.reflect.ParameterizedType
- java.lang.reflect.GenericArrayType
- java.lang.reflect.WildcardType
- java.lang.reflect.TypeVariable
1.Type直接子介面
ParameterizedType,GenericArrayType,TypeVariable和WildcardType四種類型的介面
- ParameterizedType: 表示一種引數化的型別,比如Collection
- GenericArrayType: 表示一種元素型別是引數化型別或者型別變數的陣列型別
- TypeVariable: 是各種型別變數的公共父介面
- WildcardType: 代表一種萬用字元型別表示式,比如?, ? extends Number, ? super Integer【wildcard是一個單詞:就是“萬用字元”】
2.Type直接實現子類:Class類
3. java.lang.reflect.Type介面
Type所有型別指代的有:原始型別 (raw types)【對應Class】,引數化型別 (parameterizedtypes)【對應ParameterizedType】, 陣列型別 (array types)【對應GenericArrayType】,型別變數 (type variables)【對應TypeVariable】,基本資料型別(primitivetypes)【仍然對應Class】
4. java.lang.reflect.ParameterizedType介面
ParameterizedType介面型別的含義: 表示引數化型別。比如:Map這種引數化型別
獲取引數化型別<>中的實際型別
原始碼宣告:Type[] getActualTypeArguments();
【注意】無論<>中有幾層<>巢狀,這個方法僅僅脫去最外層的<>之後剩下的內容就作為這個方法的返回值。 例子如下:
public class TestController {
public static void main(String[] args) throws Exception {
TestController testController = new TestController(); //獲取當前類
Method testParam = testController.getClass().getMethod("testParam", ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class); //獲取下面的方法
Type[] genericParameterTypes = testParam.getGenericParameterTypes(); //獲取方法泛型類引數
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericParameterType; //強轉為泛型類
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); //獲取泛型真實宣告的型別,呼叫一次只會去掉最外層的一個<>
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument.getTypeName()); //列印真實型別
}
}
}
}
public <E> E testParam(ArrayList<ArrayList<Integer>> al1,
ArrayList<E> al2,
ArrayList<String> al3,
ArrayList<? extends Number> al4,
ArrayList<E[]> al5){
Type genericSuperclass = this.getClass().getGenericSuperclass();
Class<?> superclass1 = this.getClass().getSuperclass();
Type genericSuperclass1 = al1.getClass().getGenericSuperclass();
Class<?> superclass = al1.getClass().getSuperclass();
Type aClass = al1.getClass();
if (aClass instanceof ParameterizedType) {
ParameterizedType p1 = (ParameterizedType) aClass;
}
return al2.get(0);
}
}
列印如下:
java.util.ArrayList<java.lang.Integer> // 由此可見只脫去了一層<> E java.lang.String ? extends java.lang.Number E[]
如上方法,那麼它的每一引數總體上看都是引數化型別的。
TRANSLATE with x English TRANSLATE with EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 帶著疑問去思考,然後串聯,進而歸納總結,不斷追問自己,進行自我辯證,像偵查嫌疑案件一樣看待技術問題,漆黑的街道,你我一起尋找線索,你就是技術界大偵探福爾摩斯