1. 程式人生 > >java之Type介面及其子介面

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>[]。