有时,类或方法需要对类型变量加以约束。下面是一个典型的例子。我们要计算数组中的最小元素:
public class ArrayAlg {
public static <T> T min(T[] a) {
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)
现在,泛型的 min 方法只能被实现了 Comparable 接口的类(如 String、LocalDate 等)的数组调用。由于 Rectangle 类没有实现 Comparable 接口,所以调用 min 将会产生一个编译错误。
这里的 T 和绑定类型可以是类,也可以是接口。一个类型变量或通配符可以有多个限定,例如:
T extends Comparable & Serializable
限定类型用“&”分隔,而逗号用来分隔类型变量。
需要注意的是,限定中至多有一个类,运行有多个接口,并且类必须是列表中的第一个:
T extends Employee & Comparable & Serializable // Good
T extends Employee & Manager & Serializable // Error, 因为有两个类