java之Type介面及其子介面
一. Type介面概述
自從JDK1.5引入了泛型後,我們便多了一個表示型別的介面,即Type介面。Type 是 Java 程式語言中所有型別的公共高階介面。它們包括原始型別、引數化型別、陣列型別、型別變數和基本型別。該介面只有一個預設的方法,表示對該介面的描述,比如引數型別等等。
1.1 Type的子介面
①ParameterizedType: 表示引數化型別,比如集合型別Collection<?>等等。
②TypeVariable: 型別變數介面,是各種型別變數的公共高階介面。
③GenericArrayType: 泛型陣列型別,即元素型別是引數化型別或者型別變數型別的陣列型別。
④WildcardType: 萬用字元表示式,又叫泛型表示式。
二. GenericDeclaration介面的介紹
GenericDeclaration介面是宣告型別變數的實體的公共介面。常見的反射類Class, Method, Constructor都是該介面的實現類。但Field類沒有實現該介面,所以屬性上不能宣告型別變數。
2.1 GenericDeclaration的方法
該介面只有一個方法 public TypeVariable<?>[] getTypeParameters();該方法返回宣告列表上的變數型別的陣列。
2.2 測試
我們在類上定義了型別變數T跟V,然後我們呼叫getTypeParameters()方法來獲取該類所宣告的變數陣列。然後我們遍歷獲取變數的名稱。執行結果如下:
三. ParameterizedType介面
該介面是引數化型別介面。如List<String>, Set<? extends T>,List<String[]>等等,即泛型。
3.1 ParameterizedType介面方法介紹
① getActualTypeArguments():這個方法是獲取該引數化型別的實際型別的Type物件的陣列。
② getRawType():返回宣告此引數化型別的介面或類的Type物件。
③getOwnerType(): 返回一個Type物件,此型別是其成員之一。如:引數化型別為Map.Entry<String, String>,返回就是Map型別。
3.2介面測試:
四. TypeVariable介面
該介面是型別變數介面,如引數化型別中的E, V等型別變數,表示相關一類的型別。
4.1介面方法:
①getBounds():該方法返回的是該型別變數的上限的Type物件的陣列。若沒有,則預設為Object。
②getGenericDeclaration(): 該方法返回的是宣告該型別變數的一般宣告。
③getName():返回該型別變數的名稱。
4.2測試:
測試結果:
注:型別變數宣告不能有下限。上限當然可以,如 ? extends T。我們所傳進來的引數型別必定是 T型別(T型別或其子型別),擁有T型別的屬性跟方法。但是如果是下限,如 ? super T。傳進來的引數不一定有T中的屬性跟方法,此時我們無法具體確定,故會報錯。
五. GenericArrayType介面
該介面是一種陣列型別,陣列元素的型別可以是引數化型別或者型別變數。
5.1 介面的方法:
①getGenericComponentType():該方法返回的是陣列元素的型別的Type物件。
5.2測試:
測試結果:
六. WildcardType介面
萬用字元表示式或泛型表示式。如 ? extends T 或 ? super V的格式。
6.1介面方法:
①getUpperBounds():該方法返回的是該型別變數的上界的Type物件的陣列。
②getLowerBounds(): 該方法返回的是該型別變數的下界的Type物件的陣列。
6.2測試:
測試結果:
七. java中的所有型別
①raw type:原始型別,對應Class。不僅僅是常說的類,還有介面,列舉,註釋等等。
②parameterized type:引數化型別,對應ParameterizedType介面。
③array type:陣列型別,對應GenericArrayType介面。
④type variable:型別變數,對應TypeVariable介面。
⑤primitive type:基本型別,對應還是Class。
注:WildcardType介面不是java中的型別。它僅僅是一個表示式而已,可能被包含在引數化型別中,如List<? extends T>,或被包含在陣列型別中,如List<? extends T>[]。