標籤:generics class lock table 報錯 萬用字元 x11 直接 add
1、什麼是泛型?
泛型(Generics )是把型別參數化,運用於類、介面、方法中,可以通過執行泛型型別調用 分配一個類型,將用分配的具體類型替換泛型型別。然後,所分配的類型將用於限制容器內使用的值,這樣就無需進行類型轉換,還可以在編譯時間提供更強的類型檢查。
2、泛型有什麼用?
泛型主要有兩個好處:
(1)消除顯示的強制類型轉換,提高代碼複用
(2)提供更強的類型檢查,避免運行時的ClassCastException
3、泛型的使用
型別參數(又稱類型變數)用作預留位置,指示在運行時為類配置類型。根據需要,可能有一個或多個型別參數,並且可以用於整個類。根據慣例,型別參數是單個大寫字母,該字母用於指示所定義的參數類型。下面列出每個用例的標準型別參數:
E:元素
K:鍵
N:數字
T:類型
V:值
S、U、V 等:多參數情況中的第 2、3、4 個類型
? 表示不確定的java類型(無限制萬用字元類型)
4、有界泛型
<? extends T>:是指 “ 上界萬用字元 (Upper Bounds Wildcards) ”
<? super T>:是指 “ 下界萬用字元 (Lower Bounds Wildcards) ”
—這裡有個坑
如 List<? extends T> 大家以為元素為 T以及其所有子類的對象 的List。其實不是。元素類型 僅指T的某一個不確定的子類,是單一的一個不確定類,沒有具體哪個類。因此不能插入一個不確定的。
List<? super T> 大家以為元素為 T以及其父類的對象 的List。其實不是,元素類型 僅指T的某一個不確定的父類,是單一的一個不確定類(只確定是T的父類),沒有具體哪個類。
因此:
不能往List<? extends T>中插入任何類型的對象。唯一可以保證的是,你可以從中讀取到T或者T的子類。
可以往List<? super T>中插入T或者T子類的對象,但不可以插入T父類的對象。可以讀取到Object或者Object子類的對象(你並不知道具體的子類是什麼)
總結一下:
如果頻繁支援讀取資料,不要求寫資料,使用<? extends T>。即生產者 使用 <? extends T>;
如果頻繁支援寫入資料,不特別要求讀資料,使用<? super T>。即消費者 使用 <? super T>;
如果都需要支援,使用<T>。
5、類型擦除
Java的泛型在編譯期間,所有的泛型資訊都會被擦除掉。
6、泛型型別資訊
Java 泛型小結