亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java泛型的用法及T.class的獲取過(guò)程解析

 更新時(shí)間:2019年11月05日 09:13:27   作者:Choose_and_be_chosen  
這篇文章主要介紹了Java泛型的用法及T.class的獲取過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java泛型的用法及T.class的獲取過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

胡亂總結(jié)泛型的四點(diǎn)作用:

第一是泛化,可以拿個(gè)T代表任意類型。 但GP是被C++嚴(yán)苛的靜態(tài)性逼出來(lái)的,落到Java、C#這樣的花語(yǔ)平原里----所有對(duì)象除幾個(gè)原始類型外都派生于Object,再加上Java的反射功能,Java的Collection庫(kù)沒(méi)有范型一樣過(guò)得好好的。

第二是泛型 + 反射,原本因?yàn)镴ava的泛型拿不到T.class而覺(jué)得泛型沒(méi)用,最近才剛剛學(xué)到通過(guò)反射的API來(lái)獲取T的Class,后述。

第三是收斂,就是增加了類型安全,減少了強(qiáng)制類型轉(zhuǎn)換的代碼。這點(diǎn)倒是Java Collection歷來(lái)的弱項(xiàng)。

第四是可以在編譯期搞很多東西,比如MetaProgramming。但除非能完全封閉于框架內(nèi)部,框架的使用者和擴(kuò)展者都不用學(xué)習(xí)這些東西的用法,否則那就是自絕于人民的票房毒藥。C++的MetaProgramming好厲害吧,但對(duì)比一下Python拿Meta Programming生造一個(gè)Class出來(lái)的簡(jiǎn)便語(yǔ)法,就明白什么才是真正的叫好又叫座。

所以,作為一個(gè)架構(gòu)設(shè)計(jì)師,應(yīng)該使用上述的第2,3項(xiàng)用法,在框架類里配合使用反射和泛型,使得框架的能力更強(qiáng); 同時(shí)采用收斂特性,本著對(duì)人民負(fù)責(zé)的精神,用泛型使框架更加類型安全,更少?gòu)?qiáng)制類型轉(zhuǎn)換。

擦拭法避免了Java的流血分裂 :

大家經(jīng)常罵Java GP的擦拭法實(shí)現(xiàn),但我覺(jué)得多虧于它的中庸特性---如果你用就是范型,不用就是普通Object,避免了Java陣營(yíng)又要經(jīng)歷一場(chǎng)to be or not to be的分裂。
最大的例子莫過(guò)Java 5的Collection 框架, 比如有些同學(xué)堅(jiān)持認(rèn)為自己不會(huì)白癡到類型出錯(cuò),而且難以忍受每個(gè)定義的地方都要帶一個(gè)泛型定義List〈Book〉,不用強(qiáng)制類型轉(zhuǎn)換所省下的代碼還不夠N處定義花的(對(duì)了,java里面還沒(méi)有tyepdef.....),因此對(duì)范型十分不感冒,這時(shí)就要齊齊感謝這個(gè)搽拭法讓你依然可以對(duì)一個(gè)泛型框架保持非泛型的用法了...

<<干貨來(lái)了!!!!!!>>

通過(guò)反射獲得 T.class:

abstract public class BaseHibernateEntityDao<T> extends HibernateDaoSupport {
    private Class<T> entityClass;
    public BaseHibernateEntityDao() {
      entityClass =(Class<T>) ((ParameterizedType) getClass()
          .getGenericSuperclass()).getActualTypeArguments()[0];
} public T get(Serializable id) { T o = (T) getHibernateTemplate().get(entityClass, id); return o; } }

重點(diǎn)就是這句話:

Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

解釋:

1. public Type getGenericSuperclass()

用來(lái)返回表示當(dāng)前Class 所表示的實(shí)體(類、接口、基本類型或 void)的直接超類的Type。如果這個(gè)直接超類是參數(shù)化類型的,則返回的Type對(duì)象必須明確反映在源代碼中聲明時(shí)使用的類型。比如:

import java.lang.reflect.ParameterizedType; 
public class GT1 extends GT2<Integer>{ 
  public static void main(String[] args) { 
    System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass())); 
  } 
}

則輸出結(jié)果即為:

GT2<java.lang.Integer>

如果此Class代表的是Object 類、接口、基本類型或 void,則返回 null。。如果此對(duì)象表示一個(gè)數(shù)組類,則返回表示 Object 類的 Class 對(duì)象。

2. public Type[] getGenericInterfaces()

與上面那個(gè)方法類似,只不過(guò)Java的類可以實(shí)現(xiàn)多個(gè)接口,所以返回的Type必須用數(shù)組來(lái)存儲(chǔ)。

以上兩個(gè)方法返回的都是Type對(duì)象或數(shù)組,在我們的這個(gè)話題中,Class都是代表的參數(shù)化類型,因此可以將Type對(duì)象Cast成ParameterizedType對(duì)象。而 ParameterizedType對(duì)象有一個(gè)方法, getActualTypeArguments()。

public Type[] getActualTypeArguments()

用來(lái)返回一個(gè)Type對(duì)象數(shù)組,這個(gè)數(shù)組代表著這個(gè)Type聲明中實(shí)際使用的類型。接著使用上面的例子:

import java.lang.reflect.ParameterizedType; 
public class GT1 extends GT2<Integer>{ 
  public static void main(String[] args) { 
  System.out.println(((ParameterizedType)new GT1().getClass().getGenericSuperclass()).getActualTypeArguments()[0]); 
  } 
}

這次的顯示結(jié)果將是:class java.lang.Integer

因此,我們可以通過(guò)繼承+反射的方法,來(lái)的到T.class。

需要說(shuō)明的是,江南白衣使用的方法是將關(guān)鍵語(yǔ)句

 Class < T > entityClass = (Class < T > ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];

放在了超類,也就是聲明泛型的那個(gè)類的構(gòu)造方法中。這樣一來(lái),子類在繼承具有泛型的超類時(shí),會(huì)自動(dòng)調(diào)用超類的構(gòu)造方法。在此超類的構(gòu)造方法中,調(diào)用的getClass返回的是子類的Class類型(與通常的重寫(xiě)機(jī)制有悖,呵呵,有待深究,但測(cè)試結(jié)果確是如此),則在子類中就無(wú)需再顯式地使用getGenericInterfaces()和getGenericSuperclass()等方法了。

接著,再使用(Class<T>)對(duì) getActualTypeArguments()返回的元素做casting,即可得到所謂的T.class。

泛型之后,所有BaseHibernateEntityDao的子類只要定義了泛型,就無(wú)需再重載getEnttityClass(),get()函數(shù)和find()函數(shù),銷益挺明顯的,所以SpringSide的Dao基類毫不猶豫就泛型了。

不過(guò)擦拭法的大棒仍在,所以子類的泛型語(yǔ)法可不能亂寫(xiě),最正確的用法只有:

public class BookDao extends BaseHibernateEntityDao<Book>

個(gè)人見(jiàn)解:即他們之間的關(guān)系就是 BaseHibernateEntityDao 是一個(gè)父類,他可以是單純的一個(gè)類,也可以是實(shí)現(xiàn)接口的類,而應(yīng)其中泛型的緣故,所以他直接實(shí)例化調(diào)用其中方法是沒(méi)有意義的,因?yàn)榉盒偷念愋蜔o(wú)法確定,所以只有通過(guò)用其它類去繼承它,在繼承時(shí)將泛型傳入,此時(shí)若實(shí)例化繼承了BaseHibernateEntityDao 的類,BaseHibernate EntityDao的構(gòu)造器中就會(huì)通過(guò)反射確定該泛型的類型.(有誤請(qǐng)指正)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatisplus實(shí)現(xiàn)自動(dòng)填充時(shí)間的項(xiàng)目實(shí)踐

    mybatisplus實(shí)現(xiàn)自動(dòng)填充時(shí)間的項(xiàng)目實(shí)踐

    在數(shù)據(jù)庫(kù)操作中,頻繁設(shè)置創(chuàng)建時(shí)間和更新時(shí)間字段非常繁瑣,通過(guò)使用MyBatis-Plus的自動(dòng)填充功能,可以簡(jiǎn)化操作,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-10-10
  • 在Java中讀取CSV文件的方式

    在Java中讀取CSV文件的方式

    在項(xiàng)目開(kāi)發(fā)中我們經(jīng)常需要讀取csv的內(nèi)容的操作,讀取的邏輯并不復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于在Java中讀取CSV文件的方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 解決httpServletRequest.getParameter獲取不到參數(shù)的問(wèn)題

    解決httpServletRequest.getParameter獲取不到參數(shù)的問(wèn)題

    這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例,簡(jiǎn)述了異或運(yùn)算以及具體實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Android接入微信支付的方法

    Android接入微信支付的方法

    這篇文章主要介紹了Android接入微信支付的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java中g(shù)etResourceAsStream用法分析

    Java中g(shù)etResourceAsStream用法分析

    這篇文章主要介紹了Java中g(shù)etResourceAsStream用法,較為詳細(xì)的分析了getResourceAsStream的功能及用法,需要的朋友可以參考下
    2015-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • IDEA自動(dòng)清理類中未使用的import包的操作方法

    IDEA自動(dòng)清理類中未使用的import包的操作方法

    在項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)引入很多未使用的import包,這不僅增加了編譯時(shí)間,還會(huì)使代碼可讀性變差,設(shè)置IDEA自動(dòng)清理未使用的import包,可以提高代碼的可讀性,本文給大家介紹IDEA自動(dòng)清理類中未使用的import包的方法,感興趣的朋友一起看看吧
    2024-09-09
  • MyBatisPlus+Lombok實(shí)現(xiàn)分頁(yè)功能的方法詳解

    MyBatisPlus+Lombok實(shí)現(xiàn)分頁(yè)功能的方法詳解

    Lombok是一個(gè)Java類庫(kù),提供了一組注解,簡(jiǎn)化POJO實(shí)體類開(kāi)發(fā)。本文將為大家介紹一下Lombok的使用以及如何利用MyBatisPlus+Lombok實(shí)現(xiàn)分頁(yè)功能,感興趣的可以動(dòng)手嘗試一下
    2022-07-07
  • Java如何利用LocalDate獲取某個(gè)月的第一天與最后一天日期

    Java如何利用LocalDate獲取某個(gè)月的第一天與最后一天日期

    這篇文章主要給大家介紹了關(guān)于Java如何利用LocalDate獲取某個(gè)月的第一天與最后一天日期的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01

最新評(píng)論