为什么排序要使用一个对象数组?

3

我刚刚发现了java.util.Arrays中的以下sort重载:

public static void sort(Object[] a)

public static <T> void sort(T[] a, Comparator<? super T> c)

为什么第一个重载不是通用的,而第二个重载是通用的?为什么第一个重载使用 Object[] 而不是 Comparable[]?文档甚至指出:

数组中的所有元素都必须实现 Comparable 接口。

那么,不通过 Java 的静态类型系统验证这个约束有什么意义呢?

4
也许第一个是在泛型被引入之前存在的? - Oliver Charlesworth
1
@Oli,在泛型出现之前,它仍然可以采用Comparable[],对吗? - fredoverflow
请注意,TreeSet 有相同的“怪异性”:您实际上可以使用未实现 Comparable 接口的类创建 TreeSet,但在运行时会出现 ClassCastException。然而,数组是另一个问题,因为在运行时,A[]B[] 不同于泛型集合。 - fge
@fge:我认为TreeSet接受没有实现Comparable接口的元素,如果你提供了一个Comparator,那是为了兼容性的原因。 - Marco Forberg
2个回答

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;
        }
    });
}

2
第一个方法 (void sort(Object[] a)) 不是泛型的,因为:
  1. 它在泛型出现之前就被引入了
  2. 它实际上不需要泛型
第二个方法需要泛型,我认为只是因为这个结构 Comparator<? super T>,因为没有其他方便的方法来声明 Comparator 类的第二个参数的限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接