为什么排序采用Object数组?

时间:2013-06-05 09:07:04

标签: java arrays sorting comparator comparable

我偶然发现了sortjava.util.Arrays的以下重载:

public static void sort(Object[] a)

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

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

  

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

那么用Java的静态类型系统验证该约束是什么意思呢?

2 个答案:

答案 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))不是通用的,因为:

  1. 在generics出现在Java
  2. 之前引入
  3. 它实际上不需要泛型
  4. 第二个需要泛型,我认为,仅仅是由于这种构造Comparator<? super T>,因为没有另一种方便的方法来在Comparator类的第二个参数下声明限制。