最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

第二是泛型 + 反射,原本因為Java的泛型拿不到T.class而覺得泛型沒用,最近才剛剛學(xué)到通過反射的API來獲取T的Class,后述。

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

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

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

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

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

<<干貨來了!!!!!!>>

通過反射獲得 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; } }

重點就是這句話:

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

解釋:

1. public Type getGenericSuperclass()

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

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。。如果此對象表示一個數(shù)組類,則返回表示 Object 類的 Class 對象。

2. public Type[] getGenericInterfaces()

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

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

public Type[] getActualTypeArguments()

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

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

因此,我們可以通過繼承+反射的方法,來的到T.class。

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

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

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

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

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

不過擦拭法的大棒仍在,所以子類的泛型語法可不能亂寫,最正確的用法只有:

public class BookDao extends BaseHibernateEntityDao<Book>

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

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

相關(guān)文章

  • Mybatis特殊字符轉(zhuǎn)義查詢實現(xiàn)

    Mybatis特殊字符轉(zhuǎn)義查詢實現(xiàn)

    本文主要介紹了Mybatis特殊字符轉(zhuǎn)義查詢實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • spring cloud將spring boot服務(wù)注冊到Eureka Server上的方法

    spring cloud將spring boot服務(wù)注冊到Eureka Server上的方法

    本篇文章主要介紹了spring cloud將spring boot服務(wù)注冊到Eureka Server上的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 關(guān)于Java中的可見性和有序性問題

    關(guān)于Java中的可見性和有序性問題

    這篇文章主要介紹了關(guān)于Java中的可見性和有序性問題,Java在誕生之初就支持多線程,自然也有針對這三者的技術(shù)方案,今天就學(xué)習(xí)一下Java如何解決其中的可見性和有序性導(dǎo)致的問題,需要的朋友可以參考下
    2023-08-08
  • SpringBoot jackson 精度處理問題解決

    SpringBoot jackson 精度處理問題解決

    由于JavaScript處理的最大數(shù)值限制,較大的雪花ID在JS中容易溢出,為解決此問題,可在SpringMVC或SpringBoot中使用@RequestBody注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Springboot使用@Cacheable注解實現(xiàn)數(shù)據(jù)緩存

    Springboot使用@Cacheable注解實現(xiàn)數(shù)據(jù)緩存

    本文介紹如何在Springboot中通過@Cacheable注解實現(xiàn)數(shù)據(jù)緩存,在每次調(diào)用添加了@Cacheable注解的方法時,Spring 會檢查指定參數(shù)的指定目標(biāo)方法是否已經(jīng)被調(diào)用過,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • Java?nacos動態(tài)配置實現(xiàn)流程詳解

    Java?nacos動態(tài)配置實現(xiàn)流程詳解

    使用動態(tài)配置的原因是properties和yaml是寫到項目中的,好多時候有些配置需要修改,每次修改就要重新啟動項目,不僅增加了系統(tǒng)的不穩(wěn)定性,也大大提高了維護(hù)成本,非常麻煩,且耗費時間
    2022-09-09
  • SpringBoot如何集成i18n(多語言)

    SpringBoot如何集成i18n(多語言)

    這篇文章主要介紹了SpringBoot如何集成i18n(多語言)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java理論基礎(chǔ)函數(shù)式接口特點示例解析

    java理論基礎(chǔ)函數(shù)式接口特點示例解析

    這篇文章主要為大家介紹了java理論基礎(chǔ)函數(shù)式接口特點示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java web xml文件讀取解析方式

    Java web xml文件讀取解析方式

    這篇文章主要介紹了Java web xml文件讀取解析方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較

    深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較

    這篇文章主要介紹了ArrayList 和 LinkedList的執(zhí)行效率比較的相關(guān)資料,需要的朋友可以參考下
    2017-08-08

最新評論

甘南县| 台东县| 驻马店市| 本溪市| 岑溪市| 遂平县| 桑日县| 尉犁县| 叙永县| 宁阳县| 新安县| 高邮市| 诏安县| 鹤庆县| 会理县| 新乡县| 静乐县| 华宁县| 郓城县| 宜君县| 亚东县| 抚松县| 贡觉县| 林甸县| 西藏| 黎平县| 高唐县| 翁牛特旗| 娱乐| 德安县| 都匀市| 平乡县| 平远县| 彭水| 汝阳县| 儋州市| 察哈| 大连市| 南康市| 仁布县| 武邑县|