泛型程序设计(Generic programming)意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集 String 和 File 对象分别设计不同的类。

类型参数的好处

在 Java 中增加范型类之前,ArrayList 类只维护一个 Object 引用的数组:

  1. public class ArrayList {
  2. private Object[] elementData;
  3. ...
  4. public Object get(int i) {...}
  5. public void add(Object o) {...}
  6. }

这种方法有两个问题:

  1. 当获取一个值时必须进行强制类型转换。
  1. ArrayList files = new ArrayList();
  2. ...
  3. String filename = (String) files.get(0);
  1. 没有错误检查。可以向数组列表中添加任何类的对象。
  1. files.add(new File("..."));

对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。

泛型提供了一个更好的解决方案:类型参数(type parameters)。ArrayList类有一个类型参数用来指示元素的类型:

  1. ArrayList<String> files = new ArrayList<String>();

在 Java SE 7 之后,构造函数可以省略泛型类型:

  1. ArrayList<String> files = new ArrayList<>();