类和方法需要对类型变量加以约束。
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的min方法内部用到了compareTo,问题来了,不是任何类型都有这个方法。
我们可以对类型变量T设置限定–bound 实现这一点:
public static <T extends Comparable> 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;
}
public interface Comparable {}
Comparable是一个接口为什么设置限定用extends?
T本身表示一个类型,用extends表示子类型,其实这个关键字硬记就行了。
多个限定这里用&连接,这是和常用表示不同的地方。
public static <T extends Comparable & Serializable> 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;
}