第八章 泛型程序設計
阿新 • • 發佈:2018-09-15
ali 編譯 可變 args ppr 泛型 會有 運行時 amp
為什麽要使用泛型
- 泛型的魅力是使程序有更好的安全性和可讀性
泛型類型限定
- 使用extends關鍵字限定泛型必須是某個接口的子類, 可以有多個類型如
T extends Comparable & Serializable
, 規定限定中至多有一個類, 且這個類必須出現在列表的第一個位置. - 方法的類型擦除會生成僅返回值類型不同的方法, 在java代碼中這是不允許的, 但編譯器可以處理這種情況.
- 1.泛型發生在編譯階段;2.所有的類型參數都用他們的限定類型替換,沒有則替換為Object;3.橋方法被合成來保持多態;4.為保證安全性必要時插入強制類型轉換
約束和局限
- 所有的約束均由類型擦除引起
- 不能用基本類型
- 運行時的類型查詢只適用於原始類型, 如使用instanceof是會編譯錯誤, getCalss()時不同泛型參數返回的Class對象是一樣的
- 不能創建參數化類型的數組, 但是可以聲明, 如
MyClass<String> array;
是可以的. 使用泛型的Arraylist吧. - 對於可變數量的參數列表, 它的實質是個數組, 所以也受上述約束, 但不會有編譯錯誤, 只會得到一個警告; 除了用
@SuppressWarning("unchecked")
消除警告, java7提供了@SafeVarargs
標註來標註泛型方法. - 不能實例化類型變量, Java8之後最好的解決方式是讓調用者提供一個構造器表達式, 使用到了函數式接口
Supplier<T>
- 同樣不能構造泛型數組
- 泛型類的靜態上下文類型變量無效
- 不能拋出或捕獲泛型類的實例, 這意味著無法定義Excption的子類
- 可以消除對受查異常的檢查,如
@SuppressWarning("unchecked")
- 註意擦除後的沖突, 如泛型的
equals(T t)
方法將於擦除後的Object的同名方法沖突.
第八章 泛型程序設計