泛型程序设计(Generic programming)意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集 String 和 File 对象分别设计不同的类。
类型参数的好处
在 Java 中增加范型类之前,ArrayList 类只维护一个 Object 引用的数组:
public class ArrayList {
private Object[] elementData;
...
public Object get(int i) {...}
public void add(Object o) {...}
}
这种方法有两个问题:
- 当获取一个值时必须进行强制类型转换。
ArrayList files = new ArrayList();
...
String filename = (String) files.get(0);
- 没有错误检查。可以向数组列表中添加任何类的对象。
files.add(new File("..."));
对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。
泛型提供了一个更好的解决方案:类型参数(type parameters)。ArrayList类有一个类型参数用来指示元素的类型:
ArrayList<String> files = new ArrayList<String>();
在 Java SE 7 之后,构造函数可以省略泛型类型:
ArrayList<String> files = new ArrayList<>();