泛型
泛型實現了參數化類型概念,使代碼可以應用於多種類型
簡單泛型
- 元組是一個單一對象,它將以組隊想直接打包存儲於其中,它允許讀取不允許存放(也叫做信使,數據傳送對象)
泛型接口
泛型方法
- 可以在類中參數化方法,是否擁有泛型方法,與所在類是否是泛型的沒有關係
- 泛型方法使得該方法能夠獨立於類而產生變化
- 如果使用泛型方法可以取代將整個類泛型化,那麼就應該只是用泛型方法
- 定義泛型方法只需要將反省參數列表至於返回值之前
- 是用泛型方法是通常不必指明參數類型,編譯器會找出具體類型,稱作類型參數推斷。
- 像調用普通方法一樣調用泛型方法,而且就好像是方法被無限次重載過
- 泛型方法與可變參數可以很好地共存
匿名內部類
擦除的神祕之處
- 在反省代碼內部,無法獲得任何有關反省參數類型的信息。
- java泛型使用擦除來實現,任何具體的類型信息都被擦出了,唯一知道的就是在使用一個對象。
- 擦除的代價是:不能用於顯示地引用運行時類型的擦做之中,如轉型,instancof和new
-
擦除在方法體中溢出了類型信息,所以在運行時的問題就是邊界,即對象進入和離開方法的地點,這些正是編譯器在編譯器兼執行類型檢查並插入轉型代碼的地點
- 泛型中的所有動作都發生在邊界處,對傳遞進來的值進行額外的編譯器檢查,並插入對傳遞出去的值的轉型
擦除的補償
- 顯示的傳遞類型的Class對象,並在表達式中使用它
- 不能創建泛型數組,在任何想要創建泛型數組的地方使用ArrayList
邊界
- extends關鍵字在泛型邊界上下文環境中和普通情況下具有的意義是完全不同的
通配符
- Apple是一種Fruit,不代表List就是一種List。
- 超類通配符super
- 無界通配符?
問題
- 任何基本類型都不能作爲類型參數,使用包裝類
- 一個類不能實現同一個泛型接口的萊昂個變體,由於擦除的原因,兩個變體會變成相同的接口產生衝突
- 使用帶有泛型類型參數的轉型或instanceof不會有任何效果
異常
- catch語句不能捕獲泛型類型的異常
- 類型參數可能會在一個方法的throws字句中用到
混型
- 其最基本的概念是混合多個類的能力已產生一個可以表示混型中所有類型的類
泛型真是博大精坑啊!