1. 程式人生 > 其它 >Java型別中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType詳解

Java型別中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType詳解

和反射+泛型有關的介面型別

  • 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
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian
TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 帶著疑問去思考,然後串聯,進而歸納總結,不斷追問自己,進行自我辯證,像偵查嫌疑案件一樣看待技術問題,漆黑的街道,你我一起尋找線索,你就是技術界大偵探福爾摩斯