有时,类或方法需要对类型变量加以约束。下面是一个典型的例子。我们要计算数组中的最小元素:

    1. public class ArrayAlg {
    2. public static <T> T min(T[] a) {
    3. if (a == null || a.length ==0 ) return null;
    4. T smallest = a[0];
    5. for (int i = 1; i < a.length; i++)
    6. if (smallest.compareTo(a[i]) > 0) smallest = a[i];
    7. return smallest;
    8. }
    9. }

    这里有个问题,怎么才能保证 T 所属的类有 compareTo() 方法呢?
    解决这个问题的方案是将 T 限制为实现了 Comparable 接口的类:

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

    现在,泛型的 min 方法只能被实现了 Comparable 接口的类(如 String、LocalDate 等)的数组调用。由于 Rectangle 类没有实现 Comparable 接口,所以调用 min 将会产生一个编译错误。
    这里的 T 和绑定类型可以是类,也可以是接口。一个类型变量或通配符可以有多个限定,例如:

    1. T extends Comparable & Serializable

    限定类型用“&”分隔,而逗号用来分隔类型变量。
    需要注意的是,限定中至多有一个类,运行有多个接口,并且类必须是列表中的第一个:

    1. T extends Employee & Comparable & Serializable // Good
    2. T extends Employee & Manager & Serializable // Error, 因为有两个类