泛型是Java在JDK1.5版本中引入的一个特性,泛型的出现大大增强了Java代码运行时的安全性,泛型主要应用于容器类中,因为这些类会包含各种各样的其他类,所以需要用泛型来对容器中所包含的类进行约束,比如为List传入一个String的类型参数,那么,这个List对象就只能包含有String类型的类,而不能向1.5之前的原始版本一样,可以包含各种不同的类,泛型的引入大大增强了集合类的约束,减少在使用集合类时报类型转换错误的概率。
书里面建议,在使用数组时尽量采用泛型容器,而不是基本的数组类型,里面提到,数组类型具有协变性,但是泛型容器没有这一特性,这样就使得,为容器赋值的错误的代码能够在编译的阶段被发现,而不是运行的阶段,可以提高代码的质量,所谓协变性是指父类的引用指向子类的实例,比如,Object[] object = new String[3],object指向的是String的数组,但是,在泛型中,比如List<Object>和List<String>是没有父子关系的,所以泛型的数组就没有协变性。
在泛型中,我感觉只需要弄清楚无限制类型参数和无限制通配符的概念就行了。无限制类型参数通常用一个字母表示,这个字母只能代表一种类型,当然,有无限制类型参数,那么相对应的就有一个有限制的类型参数,分为? extends T 和 ? super T,前一个通常在生产者中使用,后一个通常在消费者中使用。无限制通配符就比较复杂了,原先在JDK1.5之前,容器中是不带参数的,里面的值都是用Object来表示,但这种表示方法存在的问题就是,无法保证同一个容器中所存储的值是相同类型的,所以采用了泛型的概念,无限制通配符用?表示,它的意思就是说我可以接受任何类型的参数,类似于Object但又不是Object,可以将?也看作是一个类型,这个类型可以指向任意的其他类型,但是又没有这个类型的存在,即不可能出现? x = new ?()的情况,所以在List<?>中,除了null,你不能加入任何其他的对象。
泛型本人用的不多,在看书时看的也比较艰难,以上只是一些小小的理解。