Java泛型的用法及T.class的獲取過程解析 - 程式人生
文章推薦指數: 80 %
這篇文章主要介紹了Java泛型的用法及T.class的獲取過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值, ...
程式人生>程式設計>Java泛型的用法及T.class的獲取過程解析
Java泛型的用法及T.class的獲取過程解析
阿新•來源:網路•發佈:2020-01-07
這篇文章主要介紹了Java泛型的用法及T.class的獲取過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
胡亂總結泛型的四點作用:
第一是泛化,可以拿個T代表任意型別。
但GP是被C++嚴苛的靜態性逼出來的,落到Java、C#這樣的花語平原裡----所有物件除幾個原始型別外都派生於Object,再加上Java的反射功能,Java的Collection庫沒有範型一樣過得好好的。
第二是泛型+反射,原本因為Java的泛型拿不到T.class而覺得泛型沒用,最近才剛剛學到通過反射的API來獲取T的Class,後述。
第三是收斂,就是增加了型別安全,減少了強制型別轉換的程式碼。
這點倒是JavaCollection歷來的弱項。
第四是可以在編譯期搞很多東西,比如MetaProgramming。
但除非能完全封閉於框架內部,框架的使用者和擴充套件者都不用學習這些東西的用法,否則那就是自絕於人民的票房毒藥。
C++的MetaProgramming好厲害吧,但對比一下Python拿MetaProgramming生造一個Class出來的簡便語法,就明白什麼才是真正的叫好又叫座。
所以,作為一個架構設計師,應該使用上述的第2,3項用法,在框架類裡配合使用反射和泛型,使得框架的能力更強;同時採用收斂特性,本著對人民負責的精神,用泛型使框架更加型別安全,更少強制型別轉換。
擦拭法避免了Java的流血分裂:
大家經常罵JavaGP的擦拭法實現,但我覺得多虧於它的中庸特性---如果你用就是範型,不用就是普通Object,避免了Java陣營又要經歷一場tobeornottobe的分裂。
最大的例子莫過Java5的Collection框架,比如有些同學堅持認為自己不會白痴到型別出錯,而且難以忍受每個定義的地方都要帶一個泛型定義List〈Book〉,不用強制型別轉換所省下的程式碼還不夠N處定義花的(對了,java裡面還沒有tyepdef.....),因此對範型十分不感冒,這時就要齊齊感謝這個搽拭法讓你依然可以對一個泛型框架保持非泛型的用法了...
<>
通過反射獲得T.class:
abstractpublicclassBaseHibernateEntityDao
如果這個直接超類是引數化型別的,則返回的Type物件必須明確反映在原始碼中宣告時使用的型別。
比如:
importjava.lang.reflect.ParameterizedType;
publicclassGT1extendsGT2
。
如果此物件表示一個數組類,則返回表示Object類的Class物件。
2.publicType[]getGenericInterfaces()
與上面那個方法類似,只不過Java的類可以實現多個介面,所以返回的Type必須用陣列來儲存。
以上兩個方法返回的都是Type物件或陣列,在我們的這個話題中,Class都是代表的引數化型別,因此可以將Type物件Cast成ParameterizedType物件。
而ParameterizedType物件有一個方法,getActualTypeArguments()。
publicType[]getActualTypeArguments()
用來返回一個Type物件陣列,這個陣列代表著這個Type宣告中實際使用的型別。
接著使用上面的例子:
importjava.lang.reflect.ParameterizedType;
publicclassGT1extendsGT2
需要說明的是,江南白衣使用的方法是將關鍵語句
Class
這樣一來,子類在繼承具有泛型的超類時,會自動呼叫超類的構造方法。
在此超類的構造方法中,呼叫的getClass返回的是子類的Class型別(與通常的重寫機制有悖,呵呵,有待深究,但測試結果確是如此),則在子類中就無需再顯式地使用getGenericInterfaces()和getGenericSuperclass()等方法了。
接著,再使用(Class
泛型之後,所有BaseHibernateEntityDao的子類只要定義了泛型,就無需再過載getEnttityClass(),get()函式和find()函式,銷益挺明顯的,所以SpringSide的Dao基類毫不猶豫就泛型了。
不過擦拭法的大棒仍在,所以子類的泛型語法可不能亂寫,最正確的用法只有:
publicclassBookDaoextendsBaseHibernateEntityDao
t.class泛型
Java自定義函式呼叫方法解析
«上一篇
java通過例項瞭解值傳遞和引用傳遞
下一篇»
相關推薦
.NET垃圾回收器原理及使用EntityFrameworkCore工具使用命令列js的Map函式使用方法詳解關於指令重排現象的兩個階段詳解shell程式設計入門之變數,字串,陣列,函式使用方法總結.NET正則表示式最佳用法WPF使用AForge呼叫攝像頭JS跨域之window.name實現的跨域資料傳輸
搜尋
熱門文章
AF&SD
2019-12-25
iOS自動釋放池autoreleasepool(二)
2019-12-25
Flutter-生命週期
2019-12-25
ADS
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
PHP技巧
ADS
人氣文章
iOS自動釋放池autoreleasepool(二)
2019-12-25
AF&SD
2019-12-25
Flutter-生命週期
2019-12-25
.NET正則表示式最佳用法
2022-01-31
custom-自定義API操作
2020-06-22
WPF使用AForge呼叫攝像頭
2022-01-31
WIN32申請記憶體物理頁VirtualAllocVirtualFree
2020-06-22
JS跨域之window.name實現的跨域資料傳輸
2022-01-31
GKCycleScrollView-一個輕量級的自定義輪播圖元件
2019-12-25
winform的listview,獲取單擊的某行內容
2020-06-22
熱門標籤
JavaPython演算法vuewin10JavaScriptMySQLC++jsAndroidiOSSpring資料結構C語言資料庫前端springbootC#筆記字串
ADS
延伸文章資訊
- 1Java泛型的用法及T.class的獲取過程解析 - 程式人生
這篇文章主要介紹了Java泛型的用法及T.class的獲取過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值, ...
- 2Java泛型详解:<T>和Class<T>的使用。泛型类 - 腾讯云
Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例. 2020-12-01 22:27:46. 最初发布时间:2020-12-01 19:36:10. 阅读5150.
- 3How to use Class<T> in Java? - Stack Overflow
<T> specifically stands for generic type. According to Java Docs - A generic type is a generic cl...
- 4Java泛型详解:<T>和Class<T>的使用。泛型类 - CSDN博客
- 5Java中泛型T和Class<T>以及Class<?>的理解(转) - 博客园
注意:class是java的关键字, 在声明Java类时使用; Class类的实例表示Java应用运行时的类(class ans enum)或接口(interface and annotation)(