一、Java泛型

面向对象的一个重要目标是对代码重用的支待。支持这个目标的一个重要的机制就是泛型机制。如果除去对象的基本类型外,实现方法是相同的,那么我们就可以用泛型实现(generic implementation) 来描述这种基本的功能。例如,可以编写一个方法,将由一些
项组成的数组排序;方法的逻辑关系与被排序的对象的类型尤关,此时可以使用泛型方法。

二、Pre-Java5泛型的实现

2.1 引用类型的泛型实现

引用类型的一种实现方式是依赖于Object这个超类,其中需要使用到转型(Cast),利用Object中自带的方法来实现我们想要的泛型方法。但是这种方法也存在很大的缺陷,主要体现在:Object自带的基本方法并不能满足我们的需求,很多时候需要用到我们自己编写的方法。总结一句话就是:使用Object超类再强制向下转型。

2.2 基本类型的泛型实现

基本类型的泛型实现依赖于包装类,将基本类型转化成其对应的包装类,而包装类可以像引用类型一样,通过Object来实现泛型。

2.3 使用接口

使用接口来实现泛型主要是为了解决2.1中提到的Object自带方法不能满足需求的问题。例如在进行大小比较的时候,使用comparable接口就比较合适。这种方法对于引用类型和包装类都是通用的。

三、After-Java5的泛型实现

3.1 声明一个泛型类

当指定一个泛型类时,类的声明则包含一个或多个类型参数,这些参数被放在类名后面的一对尖括号内。

3.2声明一个泛型接口

在Java 5 以前, Comparable 接口不是泛型的,而它的compareTo 方法需要一个Obje吐作为参数。于是,传递到compareTo 方法的任何引用变量即使不是一个合理的类型也都会编译,而只是在运行时报告ClassCastException错误。Java 5 中,Comparable 接口是泛型的,例如,现在String 类实现Comparable < String> 并有一个compareTo方法,这个方法以一个String 作为其参数。通过使类变成泛型类,以前只有在运行时才能报告的许多错误如今变成了编译时的错误。

3.3 自动装箱和拆箱

举个例子,如果一个int 型被传递到需要一个Integer 对象的地方,那么,编译器将在幕后插入一个对Integer 构造方法的调用。这就叫作自动装箱。而如果一个integer 对象被放到需要int的地方,则编译器将在幕后插入一个对intValue 方法的调用,这就叫作自动拆箱.因为3.1和3.2主要针对的还是引用类型和包装类型,但是有了自动装箱和拆箱,我们可以省去包装类中很多多余的操作

四、Java数组的协变性

在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素。这种属性叫做协变(covariance)。协变存在着利与弊,需要合理使用。好处:例如方便将不同的数组作为函数参数进行调用。值得注意的是协变性只有数组才有。Java的泛型是不具有协变性的,但是可以使用通配符使得泛型具有协变性,从而可以传入数组。