Java中與泛型相關的接口 之 ParameterizedType

在閱讀本文之前可以先閱讀以下三篇,以便對Java中的泛型有一個全局的認識:

  1. Java中與泛型相關的接口 之 術語定義
  2. Java中與泛型相關的接口 之 綜述
  3. Type及其子接口的來歷

簡介

ParameterizedType是Type的子接口,表示一個有參數的類型,例如Collection<T>,Map<K,V>等。但實現上 ParameterizedType并不直接表示Collection<T>和Map<K,V>等,而是表示 Collection<String>和Map<String,String>等這種具體的類型。是不是看著眼熟,其實這就是我們常說的泛型。而ParameterizedType代表的是一個泛型的實例,我們就稱ParameterizedType為“泛型實例”吧。

當創建泛型P(如:Collection<String>)時,將解析P實例化的泛型類型聲明(如:Collection<T>),并且遞歸地創建P的所有泛型參數(如:String)。

實現這個接口的“類”必須實現一個equals()方法,該方法將任何“泛型類型”(如:Collection<T>)聲明相同且“類型參數”(如:String)也相同的兩個“類”等同起來。

Type[] getActualTypeArguments()

獲取“泛型實例”中<>里面的“泛型變量”(也叫類型參數)的值,這個值是一個類型。因為可能有多個“泛型變量”(如:Map<K,V>),所以返回的是一個Type[]。

注意:無論<>中有幾層<>嵌套,這個方法僅僅脫去最外層的<>,之后剩下的內容就作為這個方法的返回值,所以其返回值類型是不確定的。

煮個栗子:

  1. List<ArrayList> a1;//返回ArrayList,Class類型
  2. List<ArrayList<String>> a2;//返回ArrayList<String>,ParameterizedType類型
  3. List<T> a3;//返回T,TypeVariable類型
  4. List<? extends Number> a4; //返回? extends Number,WildcardType類型
  5. List<ArrayList<String>[]> a5;//返回ArrayList<String>[],GenericArrayType 類型

Type getRawType()

返回最外層<>前面那個類型,即Map<K ,V>的Map。

Type getOwnerType()

獲得這個類型的所有者的類型。這主要是對嵌套定義的內部類而言的,例如于對java.util.Map.Entry<K,V>來說,調用getOwnerType方法返回的就是interface java.util.Map。

如果當前類不是內部類,而是一個頂層類,那么getOwnerType方法將返回null。

1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。