1. 程式人生 > >第八章 泛型程序設計

第八章 泛型程序設計

ali 編譯 可變 args ppr 泛型 會有 運行時 amp

為什麽要使用泛型

  • 泛型的魅力是使程序有更好的安全性和可讀性

泛型類型限定

  • 使用extends關鍵字限定泛型必須是某個接口的子類, 可以有多個類型如 T extends Comparable & Serializable, 規定限定中至多有一個類, 且這個類必須出現在列表的第一個位置.
  • 方法的類型擦除會生成僅返回值類型不同的方法, 在java代碼中這是不允許的, 但編譯器可以處理這種情況.
  • 1.泛型發生在編譯階段;2.所有的類型參數都用他們的限定類型替換,沒有則替換為Object;3.橋方法被合成來保持多態;4.為保證安全性必要時插入強制類型轉換

約束和局限

  • 所有的約束均由類型擦除引起
  1. 不能用基本類型
  2. 運行時的類型查詢只適用於原始類型, 如使用instanceof是會編譯錯誤, getCalss()時不同泛型參數返回的Class對象是一樣的
  3. 不能創建參數化類型的數組, 但是可以聲明, 如MyClass<String> array;是可以的. 使用泛型的Arraylist吧.
  4. 對於可變數量的參數列表, 它的實質是個數組, 所以也受上述約束, 但不會有編譯錯誤, 只會得到一個警告; 除了用@SuppressWarning("unchecked")消除警告, java7提供了@SafeVarargs標註來標註泛型方法.
  5. 不能實例化類型變量, Java8之後最好的解決方式是讓調用者提供一個構造器表達式, 使用到了函數式接口Supplier<T>
    ;Java8之前使用反射
  6. 同樣不能構造泛型數組
  7. 泛型類的靜態上下文類型變量無效
  8. 不能拋出或捕獲泛型類的實例, 這意味著無法定義Excption的子類
  9. 可以消除對受查異常的檢查,如@SuppressWarning("unchecked")
  10. 註意擦除後的沖突, 如泛型的equals(T t)方法將於擦除後的Object的同名方法沖突.

第八章 泛型程序設計