Java類型中ParameterizedType唬党,GenericArrayType,TypeVariabl鬼佣,WildcardType詳解

(1). 和反射+泛型有關(guān)的接口類型
java.lang.reflect.Type:java語言中所有類型的公共父接口
java.lang.reflect.ParameterizedType
java.lang.reflect.GenericArrayType
java.lang.reflect.WildcardType

  1. Type直接子接口
    ParameterizedType驶拱,GenericArrayType,TypeVariable和WildcardType四種類型的接口
    ParameterizedType: 表示一種參數(shù)化的類型晶衷,比如Collection

GenericArrayType: 表示一種元素類型參數(shù)化類型或者類型變量數(shù)組類型
TypeVariable: 是各種類型變量公共父接口
WildcardType: 代表一種通配符類型表達式蓝纲,比如?, ? extends Number, ? super Integer【wildcard是一個單詞:就是“通配符”】

  1. Type直接實現(xiàn)子類 :Class類
    ****3. java.lang.reflect.Type接口
    Type所有類型指代的有:原始類型 (raw types)【對應(yīng)Class】參數(shù)化類型 (parameterizedtypes)【對應(yīng)ParameterizedType】晌纫, 數(shù)組類型 (array types)【對應(yīng)GenericArrayType】驻龟,類型變量 (type variables)【對應(yīng)TypeVariable】,基本數(shù)據(jù)類型(primitivetypes)【仍然對應(yīng)Class】
    ****4. java.lang.reflect.ParameterizedType接口
    ParameterizedType接口類型的含義
    表示參數(shù)化類型缸匪。比如:Map這種參數(shù)化類型

獲取參數(shù)化類型<>中的實際類型
源碼聲明:Type[] getActualTypeArguments();
【注意】無論<>中有幾層<>嵌套翁狐,這個方法僅僅脫去最外層的****<>之后剩下的內(nèi)容就作為這個方法的返回值
public static E methodIV(

ArrayList> al1,

ArrayList al2,

ArrayList al3,

ArrayListextends Number> al4,
ArrayList al5){} 那么他的每一參數(shù)總體上看都是參數(shù)化類型的凌蔬。
{1}. 對于ArrayList>露懒,通過getActualTypeArguments()返回之后,脫去最外層的<>之后砂心,剩余的類型是ArrayList
懈词。
因此對這個參數(shù)的返回類型是ParameterizedType

{2}. 對于ArrayList辩诞,通過getActualTypeArguments()返回之后坎弯,脫去最外層的<>之后,剩余的類型是E。因此對這個參數(shù)的返回類型是TypeVariable抠忘。

{3}. 對于ArrayList撩炊,通過getActualTypeArguments()返回之后,脫去最外層的<>之后崎脉,剩余的類型是String拧咳。因此對這個參數(shù)的返回類型是Class

{4}. 對于ArrayListextends Number>囚灼,通過getActualTypeArguments()返回之后骆膝,脫去最外層的<>之后,剩余的類型是? ExtendsNumber灶体。因此對這個參數(shù)的返回類型是WildcardType阅签。
{5}. 對于ArrayList,通過getActualTypeArguments()返回之后蝎抽,脫去最外層的<>之后愉择,剩余的類型是E[]。因此對這個參數(shù)的返回類型是GenericArrayType织中。

所以锥涕,可能獲得各種各樣類型的實際參數(shù),所以為了統(tǒng)一狭吼,采用直接父類數(shù)組Type[]進行接收层坠。

  1. java.lang.reflect. GenericArrayType接口
    GenericArrayType接口類型的含義
    表示泛型數(shù)組類型。比如:void method(ArrayList[] al){…}****

【注意】<>不能出現(xiàn)在數(shù)組的初始化中刁笙,即new數(shù)組之后不能出現(xiàn)<>破花,否則javac無法通過。但是作為引用變量或者方法的某個參數(shù)完全可以的疲吸。
獲取泛型數(shù)組中元素的類型
源碼聲明:Type getGenericComponentType();
【注意】無論從左向右有幾個[]并列座每,這個方法僅僅脫去最右邊的****[]之后剩下的內(nèi)容就作為這個方法的返回值
為什么返回值類型Type摘悴?
public static E methodV(

String[] p1,
E[] p2,
ArrayList[] p3,

E[][] p4){}
{1}. 對于String[]峭梳,通過getComponentType()返回之后,脫去最右邊的[]之后蹂喻,剩余的類型是String葱椭。因此對這個參數(shù)的返回類型是Class
{2}. 對于E[],通過getComponentType()返回之后口四,脫去最右邊的[]之后孵运,剩余的類型是E。因此對這個參數(shù)的返回類型是TypeVariable
{3}. 對于ArrayList[]蔓彩,通過getComponentType()返回之后治笨,脫去最右邊的[]之后驳概,剩余的類型是ArrayList
因此對這個參數(shù)的返回類型是ParameterizedType

{4}. 對于E[][]旷赖,通過getComponentType()返回之后顺又,脫去最右邊的[]之后,剩余的類型是E[]杠愧。因此對這個參數(shù)的返回類型是GenericArrayType

  1. java.lang.reflect. GenericArrayType接口
    TypeVariable接口類型的含義
    表示類型參數(shù)或者又叫做類型變量。比如:void method(E e){}中的E就是類型變量

獲取類型變量的泛型限定的上邊界的類型
源碼聲明:Type[] getActualTypeArguments();
【注意】這里面僅僅是上邊界逞壁。原因就是類型變量定義的時候只能使用extends進行(多)邊界限定流济。不能使用super,否則編譯無法通過腌闯。同時extends給出的都是類型變量上邊界绳瘟。
為什么是返回類型是數(shù)組?因為類型變量可以通過&進行多個上邊界限定姿骏,因此上邊界有多個糖声,因此返回值類型是數(shù)組類型[ ]
例如下面的方法:
public static extends Map& Cloneable&Serializable> E methodVI(E e){…}

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

E的第二個上邊界是Cloneable分瘦,是Class類型
因此蘸泻,為統(tǒng)一,返回值的數(shù)組的元素類型就是Type

  1. java.lang.reflect.WildcardType接口
    WildcardType接口類型的含義
    表示通配符類型的表達式嘲玫。
    比如** void printColl(ArrayListal); 中的 ? extends Number
    注意】根據(jù)上面API的注釋提示:現(xiàn)階段通配符表達式僅僅接受一個上邊界或者下邊界悦施,這個和定義類型變量時候可以指定多個上邊界是不一樣。但是API說了去团,為了保持擴展性抡诞,這里返回值類型寫成了數(shù)組形式。實際上現(xiàn)在返回的數(shù)組的大小就是1**
    獲取通配符表達式對象的泛型限定的上邊界的類型
    源碼聲明:Type[] getUpperBounds();
    【注意】上面說了土陪,現(xiàn)階段返回的****Type[ ]中的數(shù)組大小就是1個昼汗。寫成Type[ ]是為了語言的升級而進行的擴展。
    例如下面的方法:
    {1}.** public static void**printColl(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類型
最終統(tǒng)一成Type作為數(shù)組的元素類型崩侠。

  1. Type及其子接口的來歷
    一. 泛型出現(xiàn)之前的類型
    沒有泛型的時候漆魔,只有所謂的原始類型。此時,所有的原始類型都通過字節(jié)碼文件類Class類進行抽象改抡。Class類的一個具體對象就代表一個指定的原始類型矢炼。
    二. 泛型出現(xiàn)之后的類型
    泛型出現(xiàn)之后,擴充了數(shù)據(jù)類型阿纤。從只有原始類型擴充了參數(shù)化類型句灌、類型變量類型泛型限定的的參數(shù)化類型 (含通配符+通配符限定表達式)欠拾、泛型數(shù)組類型胰锌。
    三. 與泛型有關(guān)的類型不能和原始類型統(tǒng)一到Class的原因
    [1]. 【產(chǎn)生泛型擦除的原因
    本來新產(chǎn)生的類型+原始類型都應(yīng)該統(tǒng)一成各自的字節(jié)碼文件類型對象。但是由于泛型不是最初Java中的成分藐窄。如果真的加入了泛型资昧,涉及到JVM指令集的修改,這是非常致命的荆忍。
    [2]. 【Java中如何引入泛型
    為了使用泛型的優(yōu)勢又不真正引入泛型格带,Java采用泛型擦除的機制來引入泛型。Java中的泛型僅僅是給編譯器javac使用的刹枉,確保數(shù)據(jù)的安全性和免去強制類型轉(zhuǎn)換的麻煩叽唱。但是,一旦編譯完成微宝,所有的和泛型有關(guān)的類型全部擦除尔觉。
    [3]. 【Class不能表達與泛型有關(guān)的類型
    因此,與泛型有關(guān)參數(shù)化類型芥吟、類型變量類型侦铜、泛型限定的的參數(shù)化類型 (含通配符+通配符限定表達式)泛型數(shù)組類型這些類型全部被打回原形钟鸵,在字節(jié)碼文件中全部都是泛型被擦除后的原始類型钉稍,并不存在和自身類型一致的字節(jié)碼文件。所以和泛型相關(guān)的新擴充進來的類型不能被統(tǒng)一到Class類中棺耍。
    (4). 與泛型有關(guān)的類型在Java中的表示
    為了通過反射操作這些類型以迎合實際開發(fā)的需要贡未,Java就新增了ParameterizedTypeGenericArrayType蒙袍,TypeVariableWildcardType幾種類型來代表不能被歸一到Class類中的類型但是又和原始類型齊名的類型俊卤。
    (5). Type的引入:統(tǒng)一與泛型有關(guān)的類型和原始類型Class
    引入Type的原因
    為了程序的擴展性,最終引入了Type接口作為Class害幅,ParameterizedType消恍,GenericArrayTypeTypeVariableWildcardType這幾種類型的總的父接口以现。這樣實現(xiàn)了Type類型參數(shù)接受以上五種子類的實參或者返回值類型就是Type類型的參數(shù)狠怨。
    Type接口中沒有方法的原因
    從上面看到约啊,Type的出現(xiàn)僅僅起到了通過多態(tài)來達到程序擴展性提高的作用,沒有其他的作用佣赖。因此Type接口的源碼中沒有任何方法恰矩。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憎蛤,隨后出現(xiàn)的幾起案子外傅,更是在濱河造成了極大的恐慌,老刑警劉巖俩檬,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎胰,死亡現(xiàn)場離奇詭異,居然都是意外死亡豆胸,警方通過查閱死者的電腦和手機奥洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門巷疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晚胡,“玉大人,你說我怎么就攤上這事嚼沿」琅蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵骡尽,是天一觀的道長遣妥。 經(jīng)常有香客問我,道長攀细,這世上最難降的妖魔是什么箫踩? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮谭贪,結(jié)果婚禮上境钟,老公的妹妹穿的比我還像新娘。我一直安慰自己俭识,他們只是感情好慨削,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著套媚,像睡著了一般缚态。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堤瘤,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天玫芦,我揣著相機與錄音,去河邊找鬼本辐。 笑死姨俩,一個胖子當(dāng)著我的面吹牛蘸拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环葵,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼调窍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了张遭?” 一聲冷哼從身側(cè)響起邓萨,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菊卷,沒想到半個月后缔恳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洁闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年歉甚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扑眉。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡纸泄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腰素,到底是詐尸還是另有隱情聘裁,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布弓千,位于F島的核電站衡便,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洋访。R本人自食惡果不足惜镣陕,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姻政。 院中可真熱鬧呆抑,春花似錦、人聲如沸扶歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善镰。三九已至妹萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炫欺,已是汗流浹背乎完。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留品洛,地道東北人树姨。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓摩桶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帽揪。 傳聞我的和親對象是個殘疾皇子硝清,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一芦拿、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,257評論 0 16
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法查邢,并非Fa...
    孫小磊閱讀 1,969評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蔗崎,類相關(guān)的語法,內(nèi)部類的語法扰藕,繼承相關(guān)的語法缓苛,異常的語法,線程的語...
    子非魚_t_閱讀 31,599評論 18 399
  • 在經(jīng)過一次沒有準備的面試后邓深,發(fā)現(xiàn)自己雖然寫了兩年的android代碼未桥,基礎(chǔ)知識卻忘的差不多了。這是程序員的大忌庐完,沒...
    猿來如癡閱讀 2,836評論 3 10
  • ~~前情回顧:上一章~~ 故 人 須臾钢属,遠處籠中沉睡的兩個奴隸徘熔,身體微微震顫门躯,隨即癱軟在地,仿若不省人事酷师。蒼蘿回望...
    大夢齋閱讀 279評論 0 1