因為公司的程序要兼容到JDK1.3,所以對泛型沒有系統(tǒng)的去了解下。以下是在核心技術(shù)那本書上的摘抄:
使用泛型機制編寫的程序代碼要比那些雜亂地使用Object變量,然后再進行強制類型轉(zhuǎn)換的代碼具有更好的安全性和可讀性。如:


一看就知道這個數(shù)組列表中包含的是String對象。同時編譯器據(jù)此不需要強制類型轉(zhuǎn)換,返回類型為String,而不是Object:

同時當files調(diào)用add方法,編譯器知道有一個類型是String的參數(shù)。這會比使用Object參數(shù)更安全,編譯器可以進行檢查,避免錯誤類型的對象。
泛型類:具有一個或多個類型變量的類。如下面Pair類的代碼:
























當構(gòu)造函數(shù)兩個域不同類型:

補充:類型變量使用大寫形式,且較短,如使用E表示集合的元素類型,K和V表示表的關(guān)鍵字與值的類型,T表示任意類型。
泛型方法:定義一個帶有類型參數(shù)的簡單方法。





泛型方法可以在普通的類中,也可以在泛型類中。當調(diào)用一個泛型方法時,
方法名前的尖括號中放入具體的類型:


但是在大多數(shù)情況下,方法調(diào)用中可以省略<String>類型參數(shù)。
類型變量的限定:
如下代碼,我們要計算數(shù)組中最小元素:













如此如何知道T所屬的類有compareTo方法呢?,可以將T限制為實現(xiàn)Comparable接口的類,如:

應此沒有實現(xiàn)Comparable接口,調(diào)用getMin將會產(chǎn)生一個編譯錯誤。
一個類型變量或通配符可以有多個限定,如:

泛型代碼和虛擬機
1. 虛擬機中沒有泛型,只有普通的類和方法;
2. 所有的類型參數(shù)都用他們的邊界替換;
3. 橋方法被合成為保持多態(tài)的;
4. 為保持類型的安全性,必要時插入強制類型轉(zhuǎn)換。
約束與局限性
1、 基本類型:不能用類型參數(shù)替換基本類型。因此沒有Pair<double>,只有Pair<Double>,原因是類型擦除之后Pair類具有Object類型的域,而Object不能存儲double值。
2、 運行時類型查詢:虛擬機中的對象總有一個特定的非泛型類型,所以所有的類型查詢只產(chǎn)生原始類型。所以無論何時使用instanceof或設計類型的強制類型轉(zhuǎn)換表達式都會看到一個編譯警告。同樣getClass方法總是返回原始類型。
3、 異常:不能拋出也不能捕獲泛型類的對象泛型無法擴展Throwable都不合法。如:

不能在catch子句中使用類型變量。但是在異常聲明中可以使用類型變量。如:






4、 數(shù)組:不能聲明參數(shù)化類型的數(shù)組
5、 泛型類型的實例化:不能實例化泛型,如下面就是錯誤的:







6、不能在靜態(tài)域或方法中引用類型變量。如下面的高招將無法實施:







7、擦除后的沖突:要支持擦除的轉(zhuǎn)換,需要強行限制一個類或類型變量不能同時成為兩個接口類型的子類,而這個接口是同一接口的不同參數(shù)化。