3

我只是偶然发现了sortin的以下重载java.util.Arrays

public static void sort(Object[] a)

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

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

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

那么不使用 Java 的静态类型系统验证该约束有什么意义呢?

4

2 回答 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;
        }
    });
}
于 2013-06-05T09:25:04.630 回答
2

第一个方法 ( void sort(Object[] a)) 不是通用的,因为:

  1. 它是在泛型出现之前引入的Java
  2. 它实际上不需要泛型

我认为,第二个需要泛型,只是由于这种构造Comparator<? super T>,因为没有另一种方便的方法可以在Comparator类的第二个参数下声明限制。

于 2013-06-05T09:18:58.047 回答