JDK 5.0引入了Java编程语言的几个新扩展。其中之一是泛型的引入。
    这是对泛型的介绍。您可能熟悉其他语言的类似构造,尤其是C ++模板。如果是这样,您会发现既有相似之处,也有重要区别。如果您不熟悉其他相似结构,那就更好了;您可以重新开始学习,而不会产生误解。
    泛型允许您抽象类型。最常见的示例是容器类型,例如“集合”层次结构中的那些类型。
    这是这种类型的典型用法:

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

    第3行的转换有点烦人。通常,程序员知道哪种数据已放入特定列表中。但是,强制转换是必不可少的。编译器只能保证迭代器将返回一个Object。为确保对Integer类型变量的分配是安全类型,必须进行强制转换。
    当然,转换不仅会带来混乱。由于程序员可能会犯错,因此还引入了运行时错误的可能性
    如果程序员可以实际表达自己的意图,并将列表标记为包含特定数据类型,该怎么办?这是泛型背后的核心思想。这是上面给出的程序片段的一个使用泛型版本:

    1. List<Integer>
    2. myIntList = new LinkedList<Integer>(); // 1'
    3. myIntList.add(new Integer(0)); // 2'
    4. 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的信息,该变量无论在何时何地使用都适用,编译器将对此予以保证。相反,强制类型转换告诉我们程序员在代码中的一点上认为是正确的事情。
    最终效果是提高代码的可读性和健壮性,尤其是在大型程序中。