為什么使用泛型
- 在編譯時(shí)進(jìn)行更強(qiáng)的類型檢查
- 消除類型轉(zhuǎn)換
以下對(duì)比:
List list=new ArrayList();
list.add("hello");
Strings= (String) list.get(0);
List<String> list=new ArrayList<String>();
list.add("hello");
String s=list.get(0); // no cast
?
原始類型(Raw Types)
Box rawBox=new Box();
原始類型編譯時(shí)不會(huì)進(jìn)行類型檢查洛心,從而將不安全代碼的捕獲推遲到運(yùn)行時(shí)溶弟。因此,應(yīng)避免使用原始類型尚辑。
?
通配符 (Wildcards)
上限通配符 (Upper Bounded Wildcards)
?限定類型為T和它的子類员串,只讀。
Plate<? extends T>
下界通配符類型 (Lower Bounded Wildcards)
?限定類型為T和它的基類到踏,只寫杠袱。
Plate<? super T>
無界通配符類型 (Unbounded Wildcards)
有兩種情況下,無界通配符是一種有用的方法:
1.如果您正在編寫可以使用Object class 中提供的功能實(shí)現(xiàn)的方法窝稿。
2.當(dāng) code 使用泛型 class 中不依賴于 type 參數(shù)的方法時(shí)楣富。對(duì)于 example,List.size或List.clear伴榔。實(shí)際上纹蝴,經(jīng)常使用Class<?>,因?yàn)镃lass<T>中的大多數(shù)方法都不依賴于T
注意:List<String> 不是 List<Object>的子類
public static void printList(List< ? > list) {
for (Object elem : list)
System.out.println(elem+" ");
System.out.println();
}
List<String> strList = Arrays.asList("huang", "lan", "kan");
List<Integer> intList = Arrays.asList(1, 2, 3, 4);
printList(strList); //正常調(diào)用
反面代碼 (List<Object>):
public static void printList(List< Object >list) {
for (Object elem : list)
System.out.println(elem+" ");
System.out.println();
}
List<String> strList = Arrays.asList("huang", "lan", "kan");
List<Integer> intList = Arrays.asList(1, 2, 3, 4);
printList(strList); //同樣的代碼但是報(bào)錯(cuò)