我偶然发现了sort
中java.util.Arrays
的以下重载:
public static void sort(Object[] a)
public static <T> void sort(T[] a, Comparator<? super T> c)
为什么第一个超载不是通用的,但第二个是?为什么第一次重载需要Object[]
而不是Comparable[]
?文档甚至指出:
数组中的所有元素都必须实现
Comparable
接口。
那么用Java的静态类型系统验证该约束是什么意思呢?
答案 0 :(得分:3)
如果它是通用的,第一种方法可能会更好,但它会破坏与1.5之前代码的兼容性:
static <T extends Comparable<T>> void sort(T[] a) {
...
}
static void main(String[] args) {
Object[] a = {"1", "2"};
sort(a); <- compile time error, need explicit cast sort((Comparable[])a);
}
虽然第二个编译1.4代码只有警告
public static <T> void sort(T[] a, Comparator<? super T> c) {
...
}
public static void main(String[] args) throws Exception {
Object[] a = { "1", "2" };
sort(a, new Comparator() { <-- warning
@Override
public int compare(Object o1, Object o2) {
return 0;
}
});
}
答案 1 :(得分:2)
第一种方法(void sort(Object[] a)
)不是通用的,因为:
Java
第二个需要泛型,我认为,仅仅是由于这种构造Comparator<? super T>
,因为没有另一种方便的方法来在Comparator
类的第二个参数下声明限制。