java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType說明

Java的Type接口是Java中所有類型的父親,所有類型!抄襲一張圖片,下圖展示了Type的繼承結構,下面對每一種類型做詳細說明並結合代碼的形式。

 

ParameterizedType:字面意思是參數化類型,感覺不太好理解,其實就是聲明時帶有泛型的類型,如果還不懂就看下面的例子演示吧

TypeVariable:字面意思"類型變量",其實代表的就是泛型尖括號裏的東西,比如List<T>裏的T。或者你直接聲明一個泛型變量如private T t;

爲了方便後面的講解我先創建一個用於說明的GericObj類

 

1.獲取類的泛型類型

   在class類裏獲取Type接口類型的方法看了下,只有getTypeParameters(),這個方法返回的是TypeVariable<Class>[]數組,表示的是這個類聲明的泛型,當前GericObj只聲明瞭一個泛型T所以這個方法返回的數組元素只有一個

2.獲取類的屬性泛型類型

   在GericObj類裏我聲明瞭5個屬性,帶有泛型T的List<T>items,泛型類型是string的names,不帶泛型的gericObj,帶有泛型的gericObj2和不帶泛型的List list ,還有泛型變量T t。使用下面方法測試,只要是帶有泛型的不論泛型是指定類型比如指定string類型的names還是未指定確定類型的items或者是gericObj2通過Field的getGenericType()方法獲取的類型都是ParameterizedType類型,而不帶泛型的List  list和gericObj獲取到的Type類型是Class類型,而泛型變量T t獲取到的是TypeVariable。

對於ParameterizedType對象它有getRawType()方法和getOwnerType()方法,前者獲取的是泛型尖括號前面類型,比如List<T>獲取的就是List,此時的Type就是class類型,後者獲取的是聲明的類型,比如這種Map<String,String>.Entry<String,String>這時候獲取的就是Map<String,String>

ParameterizedType的getActualTypeArguments()方法是獲取泛型參數數組,比如Map<T,E>獲取到是Type數組分別是T和E(真實類型是TypeVaible),其getBounds方法返回的是泛型的邊界,如果未設置就是Object對象

   
 

3.獲取類的方法泛型類型

  方法類Method的方法跟Type有關的方法有點多分別是獲取方法參數泛型類型的getGenericParameterTypes(),獲取方法定義上的泛型的getTypeParameters(),和獲取方法返回類型的getGenericReturnType(),返回的類型規則與屬性的一樣這裏就不再贅訴了。

  

 

GenericArrayType和WildcardType下次來補充吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章