为什么使用泛型
- 在编译时进行更强的类型检查
- 消除类型转换
以下对比:
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();
原始类型编译时不会进行类型检查,从而将不安全代码的捕获推迟到运行时。因此,应避免使用原始类型。
通配符 (Wildcards)
上限通配符 (Upper Bounded Wildcards)
限定类型为T和它的子类,只读。
Plate<? extends T>
下界通配符类型 (Lower Bounded Wildcards)
限定类型为T和它的基类,只写。
Plate<? super T>
无界通配符类型 (Unbounded Wildcards)
有两种情况下,无界通配符是一种有用的方法:
1.如果您正在编写可以使用Object class 中提供的功能实现的方法。
2.当 code 使用泛型 class 中不依赖于 type 参数的方法时。对于 example,List.size或List.clear。实际上,经常使用Class<?>,因为Class<T>中的大多数方法都不依赖于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); //正常调用
反面代码 (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); //同样的代码但是报错