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
类型变量的分配是安全类型,必须进行强制转换。
当然,转换不仅会带来混乱。由于程序员可能会犯错,因此还引入了运行时错误的可能性。
如果程序员可以实际表达自己的意图,并将列表标记为包含特定数据类型,该怎么办?这是泛型背后的核心思想。这是上面给出的程序片段的一个使用泛型版本:
List<Integer>
myIntList = new LinkedList<Integer>(); // 1'
myIntList.add(new Integer(0)); // 2'
Integer x = myIntList.iterator().next(); // 3'
注意变量myIntList
的类型声明。它指定了这不仅仅是一个任意的List
,而是一个Integer
类型的List
,写为List<Integer>
。我们说该List
是一个带有类型参数(type parameter)的泛型接口,在本例中为Integer
。在创建List
对象时,我们还会指定一个类型参数。
还要注意,第3’行上的转换已消失。
现在,您可能会认为我们已经完成的一切只是移动混乱情况。我们在第1’行具有类型参数Integer
,而不是将第3行强制转换为Integer
。但是,这里有很大的不同。编译器现在可以在编译时检查程序的类型正确性。当我们说myIntList
用类型List<Integer>
声明时,这告诉我们有关变量myIntList
的信息,该变量无论在何时何地使用都适用,编译器将对此予以保证。相反,强制类型转换告诉我们程序员在代码中的一点上认为是正确的事情。
最终效果是提高代码的可读性和健壮性,尤其是在大型程序中。