Introduction

JDK 5.0 引入了 Java 编程语言的几个新扩展。其中之一是泛型的引入。

这条线索是对泛型的介绍。您可能熟悉其他语言的类似构造,尤其是 C 模板。如果是这样,您会发现既有相似之处,也有重要区别。如果您不熟悉其他地方的相似结构,那就更好了。您可以重新开始,而无需学习任何误解。

泛型允许您抽象类型。最常见的示例是容器类型,例如“集合”层次结构中的那些类型。

这是该类型的典型用法:

List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3

第 3 行的转换有点烦人。通常,程序员知道哪种数据已放入特定列表中。但是,强制转换是必不可少的。编译器只能保证迭代器返回Object。为确保对类型Integer的变量赋值是安全类型,必须进行强制转换。

当然,演员阵容不仅会带来混乱。由于程序员可能会犯错,因此还引入了运行时错误的可能性。

如果程序员可以 true 表达自己的意图,并将列表标记为包含特定数据类型,该怎么办?这是泛型背后的核心思想。这是上面使用泛型给出的程序片段的一个版本:

List<Integer> 
    myIntList = new LinkedList<Integer>(); // 1'
myIntList.add(new Integer(0)); // 2'
Integer x = myIntList.iterator().next(); // 3'

注意变量myIntList的类型声明。它指定这不仅是任意的List,而且是IntegerList,写成List<Integer>。我们说List是带有类型参数的通用interface,在本例中为Integer。在创建列表对象时,我们还指定一个类型参数。

还要注意,第 3'行上的转换已消失。

现在,您可能会认为我们已经完成的一切只是移动混乱情况。代替在第 3 行上强制转换为Integer,我们在第 1'行上使用Integer作为类型参数。但是,这里有很大的不同。编译器现在可以在编译时检查程序的类型正确性。当我们说myIntList声明为List<Integer>类型时,这告诉我们有关变量myIntList的一些信息,该变量无论何时何地使用都适用,编译器将对此予以保证。相反,强制类型转换告诉我们程序员在代码中的一点上认为是正确的事情。

final效果是提高可读性和鲁棒性,尤其是在大型程序中。