在
java.util.Collections
类中,max
方法声明如下:
static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
// impl.
}
我的问题是,为什么类型参数
T
显式地以 Object
为上限?
如果将该方法声明为:
,会有什么不同static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
// impl.
}
static <T extends Object & Comparable<? super T>> max1(Collection<? extends T> col) {
// implementation...
}
static <T extends Comparable<? super T>> max2(Collection<? extends T> col) {
// implementation...
}
max1
和 max2
的行为相同。可以使用相同的参数调用它们,并且可以使用相同的结果。这意味着 Object
的显式上限是不必要的。至少在现代版本的 Java 中是这样;自 Java 5(首次引入泛型时)以来,泛型可能发生了一些变化。
但至少有一个区别。使用反射,边界的报告方式不同:
import java.util.Arrays;
import java.util.Collection;
public class Main {
public static <T extends Object & Comparable<? super T>> T max1(Collection<? extends T> col) {
throw new UnsupportedOperationException("not implemented");
}
public static <T extends Comparable<? super T>> T max2(Collection<? extends T> col) {
throw new UnsupportedOperationException("not implemented");
}
public static void main(String[] args) throws Exception {
var max1 = Main.class.getMethod("max1", Collection.class);
var max2 = Main.class.getMethod("max2", Collection.class);
var max1Bounds = max1.getTypeParameters()[0].getBounds();
var max2Bounds = max2.getTypeParameters()[0].getBounds();
System.out.println("max1 bounds => " + Arrays.toString(max1Bounds));
System.out.println("max2 bounds => " + Arrays.toString(max2Bounds));
}
}
输出(Java 22.0.2):
max1 bounds => [class java.lang.Object, java.lang.Comparable<? super T>]
max2 bounds => [java.lang.Comparable<? super T>]