Java5泛型的用法,T.class的獲取和為擦拭法
Java 5的泛型語法已經有太多書講了,這裡不再打字貼書。GP一定有用,不然Java和C#不會約好了似的同時開始支援GP。但大家也清楚,GP和Ruby式的動態OO語言屬於不同的意識形態,如果是一人一票,我想大部分的平民程式設計師更熱衷動態OO語言的平白自然。但如果不準備跳槽到支援JSR223的動態語言,那還是看看GP吧。
胡亂總結泛型的四點作用:
第一是泛化,可以拿個T代表任意型別。 但GP是被C++嚴苛的靜態性逼出來的,落到Java、C#這樣的花語平原裡----所有物件除幾個原始型別外都派生於Object,再加上Java的反射功能,Java的Collection庫沒有範型一樣過得好好的。
第二是泛型 + 反射,原本因為Java的泛型拿不到T.class而覺得泛型沒用,最近才剛剛學到通過反射的API來獲取T的Class,後述。
第三是收斂,就是增加了型別安全,減少了強制型別轉換的程式碼。這點倒是Java Collection歷來的弱項。
第四是可以在編譯期搞很多東西,比如MetaProgramming。但除非能完全封閉於框架內部,框架的使用者和擴充套件者都不用學習這些東西的用法,否則那就是自絕於人民的票房毒藥。C++的MetaProgramming好厲害吧,但對比一下Python拿Meta Programming生造一個Class出來的簡便語法,就明白什麼才是真正的叫好又叫座。
所以,作為一個架構設計師,應該使用上述的第2,3項用法,在框架類裡配合使用反射和泛型,使得框架的能力更強; 同時採用收斂特性,本著對人民負責的精神,用泛型使框架更加型別安全,更少強制型別轉換。
擦拭法避免了Java的流血分裂 :
大家經常罵Java GP的擦拭法實現,但我覺得多虧於它的中庸特性---如果你用就是範型,不用就是普通Object,避免了Java陣營又要經歷一場to be or not to be的分裂。
最大的例子莫過Java 5的Collection 框架, 比如有些同學堅持認為自己不會白痴到型別出錯,而且難以忍受每個定義的地方都要帶一個泛型定義List〈Book〉,不用強制型別轉換所省下的程式碼還不夠N處定義花的(對了,java裡面還沒有tyepdef.....),因此對範型十分不感冒,這時就要齊齊感謝這個搽拭法讓你依然可以對一個泛型框架保持非泛型的用法了...
通過反射獲得 T.class:
不知為何書上不怎麼講這個,是差沙告訴我才知道的,最經典的應用見Hibernate wiki的Generic Data Access Objects, 程式碼如下:
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);
}
}
精華就是這句了:
泛型之後,所有BaseHibernateEntityDao的子類只要定義了泛型,就無需再過載getEnttityClass(),get()函式和find()函式,銷益挺明顯的,所以SpringSide的Dao基類毫不猶豫就泛型了。
不過擦拭法的大棒仍在,所以子類的泛型語法可不能亂寫,最正確的用法只有:
相關文章
- 在泛型中得到T.class泛型
- Spring 中優雅的獲取泛型資訊Spring泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- Gson通過藉助TypeToken獲取泛型引數的型別的方法泛型型別
- java 匿名 泛型 獲取真實類名Java泛型
- 在Golang中使用泛型從任何map中獲取鍵的sliceGolang泛型
- 泛型類和泛型方法泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- 泛型作為返回型別的寫法泛型型別
- TypeScript 泛型介面和泛型類TypeScript泛型
- TypeScript 基本型別和泛型的使用TypeScript型別泛型
- 獲取Spring容器中Bean例項的工具類(Java泛型方法實現)SpringBeanJava泛型
- Kotlin 泛型中的 in 和 outKotlin泛型
- 《轉》ParameterizedType getGenericSuperclass 獲取泛型引數;class getClass區別Zed泛型
- Scala的泛型泛型
- 集合框架-泛型方法的概述和使用框架泛型
- 泛型的意義和作用是啥?泛型
- 獲取 iOS 裝置的型別iOS型別
- Scala 泛型型別和方法泛型型別
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- Java集合和泛型Java泛型
- 泛型類及系統中常用的泛型類泛型
- 泛型方法、初始集合和集合的遍歷泛型
- C# 泛型的協變和逆變C#泛型
- C#基礎:泛型的理解和使用C#泛型
- 泛型物件的使用泛型物件
- 泛型擦除的原理泛型
- Java中的泛型Java泛型
- Python獲取伺服器的廠商和型號資訊Python伺服器
- rust trait 關聯型別和泛型的區別RustAI型別泛型
- 泛型類、泛型方法及泛型應用泛型
- 07.集合和泛型泛型
- Java中泛型的詳細解析,深入分析泛型的使用方式Java泛型
- C#中的介面和泛型集合探討C#泛型
- Java泛型中<?> 和 <? extends Object>的異同分析Java泛型Object
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- JavaScript如何獲取元素的標籤型別JavaScript型別