6

代码:

public class CompareTest {

    public static void main(String[] args) {

        ArrayList list =  new ArrayList();
        (list).add(new CompareTest());  


        Arrays.sort(list.toArray()); //Does not throw Exception , why ?
        Collections.sort(list);   //throws ClassCastException
    }

}

根据 Java 文档: Arrays#sort

根据元素的自然顺序,按升序对指定的对象数组进行排序。数组中的所有元素都必须实现 Comparable 接口

为什么Arrays#sortClassCastException没有按照 JavaDoc 的说明抛出?

4

3 回答 3

7

因为源代码Arrays.sort()有这个快捷方式:

    int nRemaining  = hi - lo;
    if (nRemaining < 2)
        return;  // Arrays of size 0 and 1 are always sorted

所以它不需要检查数组的元素是否实现了 Comparable,因为它不必对只有一个元素的数组进行排序。

请注意,javadoc 不保证会引发 ClassCastException。

于 2013-03-16T14:28:48.567 回答
2

因为它只有一个元素...Array.sort()如果元素少于 2,则将结束而不进行排序

于 2013-03-16T14:29:49.120 回答
0

原因是列表只有一个元素,在 Arrays.sort 中从未调用 compareTo 方法,因此该元素永远不会转换为 Comparable。

但无论如何它在 Collections.sort 中被调用:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
    i.next();
    i.set((T)a[j]);
}
}

所有元素都转换为从 Comparable 延伸的 T

于 2013-03-16T14:34:53.023 回答