1.什麼是泛型
JDK5引入泛型,提供了編譯時 類型安全 檢測機制。該機制允許程序員在編譯期檢測非法的類型。
本質是參數類型,所操作的數據類型被認定爲參數。
只存在於編輯器和編譯期,jvm中沒有泛型,目的是爲了兼容低版本
2.爲什麼使用泛型
(1)增強編譯期錯誤檢測,減少因類型問題引發的運行時異常
(2)具有更強的類型檢查,不需要強轉
(3)可以使用泛型算法,增加代碼複用性
3.Java中的泛型
泛型類、泛型接口、泛型方法
4.常見類型變量名稱
E:元素(在Java集合框架中有廣泛的應用)
K:鍵
N:數字
T:類型 V:值
S,U,V 等:第二,第三,第四個類型
5.受限的類型參數
單一限制:<U extends Number>
多種限制:<U extends A & B & C>
extends表達的意義:這裏指的是廣義上“擴展”,兼有“類繼承”和“接口實現”之意 多種限制下的格式
語法要求:如果上限類型是一個類,必須第一位標出,否則編譯錯誤
泛型算法實現的關鍵:利用受限類型參數
類型推斷:根據多個受限參數的交集來推斷,取範圍最小的,沒有交集則用object
6.通配符
泛型中的?爲通配符,分爲上限通配符?extends Number:只能讀不能寫
和下限通配符 ? super Integer:只能寫不能讀
即PECS producer extends consumer super,可以類比生產者和消費者,一個只生產,一個只消費
如果只是?就是不受限通配符,這時,不能調用任何和T相關的方法
通過通配符可以在泛型類和接口直接建立聯繫,提升了API的靈活性
7.泛型的約束和侷限性(類型擦除)
(1)繼承泛型類型多態的問題,子類沒有覆蓋父類的方法(jvm中用橋方法實現)
(2)泛型類型中的方法衝突(如定義 equles(T t)與object類衝突)
(3)沒有泛型數組
泛型代碼與JVM
(1)虛擬機中沒有泛型,只有普通類和代碼
(2)編譯階段,所有泛型類的類型參數,都會被object或者限定邊界來代替
(3)繼承泛型類型時,橋方法是爲了避免類型擦除導致的多態問題