在前面介绍 Java 集合框架里的各种容器的时候,我们已经接触到泛型了,那时我们对泛型的简单理解是,类似这样 ArrayList 声明一个 ArrayList 实例,就给它做了个类型限制,让能让它其中只能放入 String 类型的元素。泛型在 Java 中的应用相当广泛,所以我们特地开辟一个章节专门讲讲 Java 泛型的工作原理和应用。
泛型的英文名叫做 generics,一系列和泛型相关的名词都是以 generic 为前缀的,比如我们马上要学习的 Generic Method,Generic Types 等。
本文的内容大纲如下:
初识泛型
其实在使用 ArrayList 的时候我们已经接触过泛型了。如果不使用泛型在创建 ArrayList 实例时指定其元素的具体类型,那么 ArrayList 可以放入任何对象(Object的实例),但是 Java 编译器只知道 List 中存放的是 Object 实例。因此,在使用时需要将它们转换为对象所属的具体类(或接口)。
List list = new ArrayList(); // 没有泛型类型约束,列表元素默认是Object类型的
list.add(new String("First MyObject"));
MyObject myObject = (String) list.get(0); // 使用列表元素时需要进行类型转换
for(Object obj : list){
// 使用前进行类型转换
String theMyObject = (String) anObject;
......
}
使用 Java 泛型可以限制插入到 ArrayList 中的对象类型,且从 ArrayList 中检索对象时无需再做类型转换。
List<String> list = new ArrayList<>();
list.add(new String("First MyObject"));
String myObject = list.get(0);
for(String obj : list){
......
}
泛型的语法就是在支持泛型的类型上,给出类型的定义。List 接口是支持泛型的,类型就是List里允许的元素的类型。创建 List 实例和引用的时候,都可以指定泛型对应的类型,比如这个例程里告诉编译器 List 元素的类型是 String。如果不指定,那就是Object这个默认类型,所以第一个例程用的 List 的元素就是 Object 类型。
泛型定义
“Java 泛型”这个技术术语,表示一组与泛型类型和方法的定义和使用相关的语言特性。在 Java 中,泛型类型(Generic Typs)或泛型方法(Generic Method)与常规类型和方法的不同之处在于它们具有类型参数。
通过提供替换形式类型参数的实际类型参数,泛型类型被实例化,形成参数化类型。像 LinkedList 这样的类是一个泛型类型,它有一个类型参数 E 。实例,例如 LinkedList 或 LinkedList,被称为参数化类型,而 String 和 Integer 是各自的实际类型参数。
为什么使用泛型
与上面 ArrayList 的例程相似,如果仔细了解 Java 集合框架中的类,会发现他们的方法大多都支持泛型类型参数,如果不使用泛型这些类提供的方法的参数和返回值都会是 Object 类型的。现在&#x