泛型程序设计
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>,因为类型必须是类。