我眼中的Java-Type體系(2)

上一篇幕侠,提到了Java-Type體系谦去,對Type類型進行了簡單的講解;本篇薄声,就用代碼的方式王悍,對其中的5大類型:原始類型(Class)破镰、參數(shù)化類型(ParameterizedType)、數(shù)組類型(GenericArrayType)压储、類型變量(TypeVariable)鲜漩、基本類型(Class) 進一步說明;

1.ParameterizedType

ParameterizedType表示參數(shù)化類型渠脉,也就是泛型宇整,例如List<T>、Set<T>等芋膘;

ParameterizedType

在ParameterizedType接口中鳞青,有3個方法,分別是getActualTypeArguments()为朋、 getRawType()臂拓、 getOwnerType();

1.1 getActualTypeArguments

獲取泛型中的實際類型,可能會存在多個泛型习寸,例如Map<K,V>,所以會返回Type[]數(shù)組胶惰;

值得注意的是,無論<>中有幾層嵌套(List<Map<String,Integer>)霞溪,getActualTypeArguments()方法永遠都是脫去最外層的<>(也就是List<>)孵滞,將口號內(nèi)的內(nèi)容(Map<String,Integer>)返回中捆;

我們經(jīng)常遇到的List<T>,通過getActualTypeArguments()方法坊饶,得到的返回值是TypeVariableImpl對象泄伪,也就是TypeVariable類型(后面介紹);

1.2 getRawType

獲取聲明泛型的類或者接口,也就是泛型中<>前面的那個值匿级;

1.3 getOwnerType

通過方法的名稱蟋滴,我們大概了解到,此方法是獲取泛型的擁有者痘绎,那么擁有者是個什么意思津函?

Returns a {@code Type} object representing the type that this type? ? * is a member of.? For example, if this type is {@code O.I},? ? * return a representation of {@code O}.? (摘自JDK注釋)

通過注解,我們得知孤页,“擁有者”表示的含義--內(nèi)部類的“父類”尔苦,通過getOwnerType()方法可以獲取到內(nèi)部類的“擁有者”;例如: Map? 就是 Map.Entry<String,String>的擁有者散庶;

2.GenericArrayType

泛型數(shù)組類型蕉堰,例如List<String>[] 、T[]等悲龟;

GenericArrayType

在GenericArrayType接口中,僅有1個方法冰寻,就是getGenericComponentType()须教;

2.1 getGenericComponentType

返回泛型數(shù)組中元素的Type類型,即List<String>[] 中的 List<String>(ParameterizedTypeImpl)斩芭、T[] 中的T(TypeVariableImpl)轻腺;

值得注意的是,無論是幾維數(shù)組划乖,getGenericComponentType()方法都只會脫去最右邊的[]贬养,返回剩下的值;

3.TypeVariable

泛型的類型變量琴庵,指的是List<T>误算、Map<K,V>中的T,K迷殿,V等值儿礼,實際的Java類型是TypeVariableImpl(TypeVariable的子類);此外庆寺,還可以對類型變量加上extend限定蚊夫,這樣會有類型變量對應(yīng)的上限;

TypeVariable

在TypeVariable接口中懦尝,有3個方法知纷,分別為getBounds()壤圃、getGenericDeclaration()、getName()琅轧;

3.1 getBounds

獲得該類型變量的上限埃唯,也就是泛型中extend右邊的值;例如 List<T extends Number> 鹰晨,Number就是類型變量T的上限墨叛;如果我們只是簡單的聲明了List<T>(無顯式定義extends),那么默認為Object模蜡;

無顯式定義extends:

值得注意的是漠趁,類型變量的上限可以為多個,必須使用&符號相連接忍疾,例如 List<T extends Number & Serializable>闯传;其中,& 后必須為接口卤妒;

3.2 getGenericDeclaration

獲取聲明該類型變量實體甥绿,也就是TypeVariableTest<T>中的TypeVariableTest;

3.3 getName

獲取類型變量在源碼中定義的名稱则披;

說到TypeVariable類共缕,就不得不提及Java-Type體系中另一個比較重要的接口---GenericDeclaration;含義為:聲明類型變量的所有實體的公共接口士复;也就是說該接口定義了哪些地方可以定義類型變量(泛型)图谷;

通過查看源碼發(fā)現(xiàn),GenericDeclaration下有三個子類阱洪,分別為Class便贵、Method、Constructor冗荸;也就是說承璃,我們定義泛型只能在一個類中這3個地方自定義泛型;

此時蚌本,我們不禁要問盔粹,我們不是經(jīng)常在類中的屬性聲明泛型嗎,怎么Field沒有實現(xiàn) GenericDeclaration接口呢魂毁?

其實玻佩,我們在Field中并沒有聲明泛型,而是在使用泛型而已席楚!不信咬崔,我們實際上代碼來看看!

1.首先在Class上定義泛型:

Class定義泛型

2.我們沒有在Class上定義泛型,直接在構(gòu)造方法上定義泛型

泛型構(gòu)造

3.同樣沒有在Class定義泛型垮斯,直接在普通方法上定義泛型

泛型方法

3.我們直接在屬性上定義

屬性上定義泛型

我們看到郎仆,如果不在Class上定義,屬性上并不能直接使用兜蠕!所以扰肌,這也是我之前說的屬性上并不是定義泛型,而是使用泛型熊杨,所以Field并沒有實現(xiàn)GenericDeclaration接口曙旭!

4.Class

Type接口的實現(xiàn)類,是我們工作中常用到的一個對象晶府;在Java中桂躏,每個.class文件在程序運行期間,都對應(yīng)著一個Class對象川陆,這個對象保存有這個類的全部信息剂习;因此,Class對象也稱之為Java反射的基礎(chǔ)较沪;

Class

通過上面的例子鳞绕,可以看出,當我們沒有聲明泛型的時候尸曼,我們普通的對象就是一個Class類型们何,是Type中的一種;

5.WildcardType

骡苞?---通配符表達式垂蜗,表示通配符泛型,但是WildcardType并不屬于Java-Type中的一鐘解幽;例如:List<? extends Number> 和 List<? super Integer>;

WildcardType

在WildcardType接口中烘苹,有2個方法躲株,分別為getUpperBounds()、getLowerBounds();

5.1 getUpperBounds

獲取泛型變量的上邊界(extends)

5.2 getLowerBounds

獲取泛型變量的下邊界(super)

以上镣衡,就是對Java-Type體系中相關(guān)對象的介紹霜定;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廊鸥,隨后出現(xiàn)的幾起案子望浩,更是在濱河造成了極大的恐慌,老刑警劉巖惰说,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨德,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機典挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門酥宴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人您觉,你說我怎么就攤上這事拙寡。” “怎么了琳水?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵肆糕,是天一觀的道長。 經(jīng)常有香客問我在孝,道長诚啃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任浑玛,我火速辦了婚禮绍申,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顾彰。我一直安慰自己极阅,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布涨享。 她就那樣靜靜地躺著筋搏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厕隧。 梳的紋絲不亂的頭發(fā)上奔脐,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音吁讨,去河邊找鬼髓迎。 笑死,一個胖子當著我的面吹牛建丧,可吹牛的內(nèi)容都是我干的排龄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼翎朱,長吁一口氣:“原來是場噩夢啊……” “哼橄维!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拴曲,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤争舞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澈灼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竞川,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了流译。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞怨。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖福澡,靈堂內(nèi)的尸體忽然破棺而出叠赦,到底是詐尸還是另有隱情,我是刑警寧澤革砸,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布除秀,位于F島的核電站,受9級特大地震影響算利,放射性物質(zhì)發(fā)生泄漏册踩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一效拭、第九天 我趴在偏房一處隱蔽的房頂上張望暂吉。 院中可真熱鬧,春花似錦缎患、人聲如沸慕的。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肮街。三九已至,卻和暖如春判导,著一層夾襖步出監(jiān)牢的瞬間嫉父,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工眼刃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绕辖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓擂红,卻偏偏與公主長得像引镊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篮条,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法吩抓,并非Fa...
    孫小磊閱讀 1,996評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法涉茧,類相關(guān)的語法,內(nèi)部類的語法疹娶,繼承相關(guān)的語法伴栓,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)钳垮,斷路器惑淳,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 終于看完了簡奧斯汀的六部作品拍成的影視劇,分別是《Pride& Prejudice(傲慢與偏見)》1940年電...
    綠蘿文竹閱讀 9,575評論 1 2