程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 談談Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType

談談Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType

編輯:關於JAVA

談談Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType。本站提示廣大學習愛好者:(談談Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType)文章只能為提供參考,不一定能成為您想要的結果。以下是談談Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType正文


(1). 和反射+泛型有關的接口類型

java.lang.reflect.Type:java說話中一切類型的公共父接口
java.lang.reflect.ParameterizedType
java.lang.reflect.GenericArrayType
java.lang.reflect.WildcardType

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 static  E methodIV( 
ArrayList> al1, 
ArrayList al2, 
ArrayList al3, 
ArrayListextends Number> al4, 
ArrayList al5){}

那末他的每參數整體上看都是參數化類型的。

{1}. 關於ArrayList>,經由過程getActualTypeArguments()前往以後,脫去最外層的<>以後,殘剩的類型是ArrayList。是以對這個參數的前往類型是ParameterizedType。

{2}. 關於ArrayList,經由過程getActualTypeArguments()前往以後,脫去最外層的<>以後,殘剩的類型是E。是以對這個參數的前往類型是TypeVariable。

{3}. 關於ArrayList,經由過程getActualTypeArguments()前往以後,脫去最外層的<>以後,殘剩的類型是String。是以對這個參數的前往類型是Class。

{4}. 關於ArrayListextends Number>,經由過程getActualTypeArguments()前往以後,脫去最外層的<>以後,殘剩的類型是? ExtendsNumber。是以對這個參數的前往類型是WildcardType。

{5}. 關於ArrayList,經由過程getActualTypeArguments()前往以後,脫去最外層的<>以後,殘剩的類型是E[]。是以對這個參數的前往類型是GenericArrayType。

所以,能夠取得各類各樣類型的現實參數,所認為了同一,采取直接父類數組Type[]停止吸收。

4. java.lang.reflect. GenericArrayType接口

GenericArrayType接口類型的寄義

表現泛型數組類型。好比:void method(ArrayList[] al){…}

【留意】<>不克不及湧現在數組的初始化中,即new數組以後不克不及湧現<>,不然javac沒法經由過程。然則作為援用變量或許辦法的某個參數是完整可以的。

獲得泛型數組中元素的類型

源碼聲明:Type getGenericComponentType();

【留意】不管從左向右有幾個[]並列,這個辦法僅僅脫去最左邊的[]以後剩下的內容就作為這個辦法的前往值。

為何前往值類型是Type?

public static E methodV(
String[] p1,
E[] p2,
ArrayList[] p3,
E[][] p4){}

{1}. 關於String[],經由過程getComponentType()前往以後,脫去最左邊的[]以後,殘剩的類型是String。是以對這個參數的前往類型是Class

{2}. 關於E[],經由過程getComponentType()前往以後,脫去最左邊的[]以後,殘剩的類型是E。是以對這個參數的前往類型是TypeVariable

{3}. 關於ArrayList[],經由過程getComponentType()前往以後,脫去最左邊的[]以後,殘剩的類型是ArrayList。是以對這個參數的前往類型是ParameterizedType

{4}. 關於E[][],經由過程getComponentType()前往以後,脫去最左邊的[]以後,殘剩的類型是E[]。是以對這個參數的前往類型是GenericArrayType

5. java.lang.reflect. GenericArrayType接口

TypeVariable接口類型的寄義

表現類型參數或許又叫做類型變量。好比:void method(E e){}中的E就是類型變量

獲得類型變量的泛型限制的上界限的類型

源碼聲明:Type[] getActualTypeArguments();

【留意】這外面僅僅是上界限。緣由就是類型變量在界說的時刻只能應用extends停止(多)界限限制。不克不及應用super,不然編譯沒法經由過程。同時extends給出的都是類型變量的上界限。

為何是前往類型是數組?由於類型變量可以經由過程&停止多個上界限限制,是以上界限有多個,是以前往值類型是數組類型[ ]。

例以下面的辦法:

public static extends Map& Cloneable&Serializable> E methodVI(E e){…}

E的第一個上界限是Map,是ParameterizedType類型

E的第二個上界限是Cloneable,是Class類型

是以,為同一,前往值的數組的元素類型就是Type

6. java.lang.reflect.WildcardType接口

WildcardType接口類型的寄義

表現通配符類型的表達式。

好比 void printColl(ArrayListal); 中的 ? extends Number

【留意】依據下面API的正文提醒:現階段通配符表達式僅僅接收一個上界限或許下界限,這個和界說類型變量時刻可以指定多個上界限是紛歧樣。然則API說了,為了堅持擴大性,這裡前往值類型寫成了數組情勢。現實上如今前往的數組的年夜小就是1

獲得通配符表達式對象的泛型限制的上界限的類型

源碼聲明:Type[] getUpperBounds();

【留意】下面說了,現階段前往的Type[ ]中的數組年夜小就是1個。寫成Type[ ]是為了說話的進級而停止的擴大。

例以下面的辦法:

{1}. public static voidprintColl(ArrayListextends ArrayList> al){}

通配符表達式是:? extendsArrayList,如許 extends前面是?的上界限,這個上界限是ParameterizedType類型。

{2}. public static  voidprintColl(ArrayListextends E> al){}

通配符表達式是:? extends E,如許 extends前面是?的上界限,這個上界限是TypeVariable類型

{3}.public static  voidprintColl(ArrayListextends E[]> al){}

通配符表達式是:? extends E[],如許 extends前面是?的上界限,這個上界限是GenericArrayType類型

{4}.public static  voidprintColl(ArrayListextends Number> al){}

通配符表達式是:? extends Number,如許 extends前面是?的上界限,這個上界限是Class類型

終究同一成Type作為數組的元素類型。

7. Type及其子接口的來歷

一. 泛型湧現之前的類型

沒有泛型的時刻,只要所謂的原始類型。此時,一切的原始類型都經由過程字節碼文件類Class類停止籠統。Class類的一個詳細對象就代表一個指定的原始類型。

二. 泛型湧現以後的類型

泛型湧現以後,擴大了數據類型。從只要原始類型擴大了參數化類型、類型變量類型、泛型限制的的參數化類型 (含通配符+通配符限制表達式)、泛型數組類型。

三. 與泛型有關的類型不克不及和原始類型同一到Class的緣由

[1]. 【發生泛型擦除的緣由】

原來新發生的類型+原始類型都應當同一成各自的字節碼文件類型對象。然則因為泛型不是最後Java中的成份。假如真的參加了泛型,觸及到JVM指令集的修正,這長短常致命的。

[2]. 【Java中若何引入泛型】

為了應用泛型的優勢又不真正引入泛型,Java采取泛型擦除的機制來引入泛型。Java中的泛型僅僅是給編譯器javac應用的,確保數據的平安性和免除強迫類型轉換的費事。然則,一旦編譯完成,一切的和泛型有關的類型全體擦除。

[3]. 【Class不克不及表達與泛型有關的類型】

是以,與泛型有關的參數化類型、類型變量類型、泛型限制的的參數化類型 (含通配符+通配符限制表達式)、泛型數組類型這些類型全體被打回本相,在字節碼文件中全體都是泛型被擦除後的原始類型,其實不存在和本身類型分歧的字節碼文件。所以和泛型相干的新擴大出去的類型不克不及被同一到Class類中。

(4). 與泛型有關的類型在Java中的表現

為了經由過程反射操作這些類型以逢迎現實開辟的須要,Java就新增了ParameterizedType,GenericArrayType,TypeVariable 和WildcardType幾品種型來代表不克不及被歸一到Class類中的類型然則又和原始類型齊名的類型。

(5). Type的引入:同一與泛型有關的類型和原始類型Class

【引入Type的緣由】

為了法式的擴大性,終究引入了Type接口作為Class,ParameterizedType,GenericArrayType,TypeVariable和WildcardType這幾品種型的總的父接口。如許完成了Type類型參數接收以上五種子類的實參或許前往值類型就是Type類型的參數。

【Type接口中沒無方法的緣由】

從下面看到,Type的湧現僅僅起到了經由過程多態來到達法式擴大性進步的感化,沒有其他的感化。是以Type接口的源碼中沒有任何辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved