因為公司的程序要兼容到JDK1.3,所以對泛型沒有系統的去了解下。以下是在核心技術那本書上的摘抄: 使用泛型機制編寫的程序代碼要比那些雜亂地使用Object變量,然后再進行強制類型轉換的代碼具有更好的安全性和可讀性。如:
一看就知道這個數組列表中包含的是String對象。同時編譯器據此不需要強制類型轉換,返回類型為String,而不是Object:
同時當files調用add方法,編譯器知道有一個類型是String的參數。這會比使用Object參數更安全,編譯器可以進行檢查,避免錯誤類型的對象。 泛型類:具有一個或多個類型變量的類。如下面Pair類的代碼:
當構造函數兩個域不同類型:
補充:類型變量使用大寫形式,且較短,如使用E表示集合的元素類型,K和V表示表的關鍵字與值的類型,T表示任意類型。 泛型方法:定義一個帶有類型參數的簡單方法。
泛型方法可以在普通的類中,也可以在泛型類中。當調用一個泛型方法時, 方法名前的尖括號中放入具體的類型:
但是在大多數情況下,方法調用中可以省略<String>類型參數。 類型變量的限定: 如下代碼,我們要計算數組中最小元素:
如此如何知道T所屬的類有compareTo方法呢?,可以將T限制為實現Comparable接口的類,如:
應此沒有實現Comparable接口,調用getMin將會產生一個編譯錯誤。 一個類型變量或通配符可以有多個限定,如:
泛型代碼和虛擬機 1. 虛擬機中沒有泛型,只有普通的類和方法; 2. 所有的類型參數都用他們的邊界替換; 3. 橋方法被合成為保持多態的; 4. 為保持類型的安全性,必要時插入強制類型轉換。
約束與局限性 1、 基本類型:不能用類型參數替換基本類型。因此沒有Pair<double>,只有Pair<Double>,原因是類型擦除之后Pair類具有Object類型的域,而Object不能存儲double值。 2、 運行時類型查詢:虛擬機中的對象總有一個特定的非泛型類型,所以所有的類型查詢只產生原始類型。所以無論何時使用instanceof或設計類型的強制類型轉換表達式都會看到一個編譯警告。同樣getClass方法總是返回原始類型。 3、 異常:不能拋出也不能捕獲泛型類的對象泛型無法擴展Throwable都不合法。如:
不能在catch子句中使用類型變量。但是在異常聲明中可以使用類型變量。如:
4、 數組:不能聲明參數化類型的數組 5、 泛型類型的實例化:不能實例化泛型,如下面就是錯誤的:
6、不能在靜態域或方法中引用類型變量。如下面的高招將無法實施:
7、擦除后的沖突:要支持擦除的轉換,需要強行限制一個類或類型變量不能同時成為兩個接口類型的子類,而這個接口是同一接口的不同參數化。
Powered by: BlogJava Copyright © kissjava