泛型是对象类型的一种泛称,它可以指代所有类型的对象,因此,泛型程序代码可以处理多种不同类型的对象。
这也是我们为什么需要泛型的原因:写出更通用的方法来提高工作效率。
通过我们对泛型在不同地方的使用,泛型程序设计大概分为三种类型:
我们通过解析下面的泛型类来进行泛型类的学习。
public class Pari<T> {
private T first;
private T second;
public Pari(){
first=null;
second=null;
}
public Pari(T first,T second){this.first=first; this.second=second; }
public T getFirst() {return first;}
public void setFirst(T first) {this.first = first;}
public T getSecond() { return second;}
public void setSecond(T second) {this.second = second; }
}
从上面的代码我们可以猜出,这个类里的泛型就是 T 。 而在一个类里是如何使用泛型的呢?
很简单,就是现在声明类的时候,在类名后面加上就行了,其中T是自定义的,它可以指代所有类型。
但是在实际使用的过程中,对T还是可以设置限制的,( < T extends Type > or < T super Type >)让T的类型在可控范围内保证程序在运行过程中不会出错。
泛型方法其实就是带有泛型参数的方法,泛型方法的好处就是和泛型类一样便于编写通用的方法,泛型方法既可以在泛型类中定义,也可以在普通类中定义。
我们先来看一个非常简单的泛型方法:
/**
* 泛型方法,参数类型是泛型,
* 可以处理多种不同类型
* @param a
* @param
* @return
*/
public static <T> T getMiddle(T[] a){
return a[a.length/2];
}
从这里可以看出一般泛型方法中的泛型声明在返回参数的前面,修饰符后面,在泛型方法中,泛型的作用范围仅限于这个方法。
泛型接口的定义其实和泛型类定义差不多,唯一的差别就是接口中没有对泛型的处理逻辑。
例如:
public interface Maximum<T extends Comparable<T>> {
/**
* 获得数组最大值
* @param array
* @return
*/
T getMax(T[] array);
/**
* 获得数组最小值
* @param array
* @return
*/
T getMin(T[] array);
/**
* 对数组进行排序
* @param array
* @return
*/
T[] sorted(T[] array);
}
好啦,现在对泛型程序的结构有了大概的了解,我们就可以接着学习如何使用泛型编写高效的程序了。
其实我们的泛型编程工作就是在泛型类,泛型方法以及泛型接口中对泛型进行处理从而达到我们想要的效果, 通过泛型编程,我们可以实现一些看起来比较高级的功能,这些高级功能让我们提高编程效率,从而从重复的劳动中解放。