简单学习Java泛型

为什么使用泛型

  1. 在编译时进行更强的类型检查
  2. 消除类型转换
    以下对比:
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); //同样的代码但是报错
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。