Java核心技術卷一第八章讀書筆記


泛型這一塊我看的比較快,沒有深究,書上這一章就有點難了,不太好理解

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警告
  • 不能實例化類型變量
  • 不能構造泛型數組
  • 泛型類的靜態上下文中類型變量無效
  • 不能拋出或捕獲泛型類的實例
  • 可以消除對受查異常的檢查
  • 注意擦除後的衝突

8.7 繼承規則、8.8通配符類型,優先級不高沒看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章