泛型程序设计

Java中的泛型与C++中的模板类似,不过没有template关键字。

泛型类

public class Pair<T>
{
    public Pair() {first = null; second = null;}
    public Pair(T first, T second) {this.first = first; this.second = second;}
    public T getFirst() {return first;}
    public T getSecond() {return second;}
    public void setFirst(T newValue) {first = newValue;}
    public void setSecond(T newValue) {second = newValue;}
    
    private T first;
    private T second;
}

泛型方法

泛型方法可以定义在普通类和泛型类中

class ArrayAlg
{
    public static <T> T getMiddle(T[] a)
    {
        return a[a.length/2];
    }
}

调用泛型方法:

String[] names = {"John", "Q.", "Public"};

String middle = ArrayAlg.<String>getMiddle(names);//实际上,<String>可以省略,Java会根据参数names的类型自动判断。

 

有时,需要对泛型中的类型加以约束。例如:

class ArrayAlg
{
    public static <T> T min(T[] a)// almost correct
    {
        if(a == null || a.length == 0) return null;
        T smallest = a[0];
        for(int i=1; i<a.length; i++)
            if(smallest.compareTo(a[i]) > 0) smallest = a[i];
        return smallest;
    }
}

上面的例子中有一个问题,那就是类型T必须实现了compareTo方法。为了加上这个约束,我们将类型T限制为实现了Comparable接口的类。

public static<T extends Comparable>T min(T[] a);

为什么用extends而不用implements?因为这里的约束不仅可以是接口,也可以是类。

一个类型变量或通配符可以有多个限定。例如:

T extends Comparable & Serializable

多个限定中,只能有一个类,可以有多个接口。类必须放在第一个。

 

约束与局限性

不能使用基本类型替换类型参数。因此,没有Pair<double>,只有Pair<Double>,因为类型必须是类。

 

posted @ 2014-12-26 17:21  米其林轮船  阅读(155)  评论(0编辑  收藏  举报