泛型這一塊我看的比較快,沒有深究,書上這一章就有點難了,不太好理解
8.1 爲什麼要使用泛型程序設計
- 從Java1.0版發佈以來,變化最大的就是泛型。使用泛型機制編寫的程序代碼要比那些雜亂的使用object變量,然後再進行強制類型轉換的代碼具有更好的安全性和可讀性
- 泛型程序設計意味着編寫的代碼可以被很多不同類型的對象所重用。
- 在Java中增加泛型類之前,泛型程序設計是用繼承實現的。但是有兩個問題:
- 當獲取一個值時必須進行強制類型轉換
- 這裏沒有錯誤檢查,可以向數組列表中添加任何類的對象
- 類型參數的魅力在於:使得程序具有更好的可讀性和安全性
- JDK開發人員已經做出了很大的努力,爲所有的集合類提供類類型參數!!!
8.2 定義簡單泛型類
- 類型變量使用大寫形式,且比較短,這是很常見的。在Java庫中,使用變量E來表示集合的元素類型,K和V來表示關鍵字與值的類型。T表示“任意類型”
8.3 泛型方法
- 實際上,還可以定義一個帶有類型參數的簡單方法:
類型變量放在修飾符的後面,返回類型的前面。當調用一個泛型方法時,在方法名錢的尖括號中放入具體的類型:class ArrayAlg{ public static<T> T getMiddle(T...a) { return a[a.lengtyh / 2]; } }
String middle = ArrayAlg.<String>getMiddle("John", "Holk");
8.4 類型變量的限定
-
有時,類或方法需要對類型變量加以約束
class ArrayAlg{ public static<T> T min(T[] a) { if(a == null || a.length == 0) return null; T smallest = a[0]; for(int i = 1; i < a.length;i++) if(smallest.compareTo(a[i]) > 0) smallest = a[i] return smallest; } }
這裏有·問題,解決問題的方法是實現Comparator接口
public static <T extends Comparator> T min(T[] a)...
-
一個類型變量或通配符可以有多個限定,例如:
T extends Comparator & Serializable
限定類型用&分割,逗號用來分割類型變量
-
在Java的繼承中,可以根據需要擁有多個接口超類型,但限定類只能有一個。如果用一個類做限定,必須把這個類寫在限定列表的第一個
8.5 泛型代碼和虛擬機
- 原始類型用一個限定類型變量來替換,如果沒有限定就替換成Object(類型擦除)
- 關於Java泛型轉換的事實:
- 虛擬機中沒有泛型,只有普通的類或方法
- 所有類型參數都用它們的限定類型替換
- 橋方法被合成來保持多態
- 爲保持類型安全性,必要時加入強制類型轉換
8.6 約束和侷限性
- 不能用基本類型實例化類型參數
- 運行時類型查詢只適用於原始類型
- 不能創建參數化類型的數組
- Varargs警告
- 不能實例化類型變量
- 不能構造泛型數組
- 泛型類的靜態上下文中類型變量無效
- 不能拋出或捕獲泛型類的實例
- 可以消除對受查異常的檢查
- 注意擦除後的衝突