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 Doc によると: Arrays#sort

要素の自然順序付けに従って、指定されたオブジェクトの配列を昇順に並べ替えます。配列内のすべての要素は Comparable インターフェイスを実装する必要があります

JavaDoc で述べられているようにArrays#sortがスローされないのはなぜですか?ClassCastException

4

3 に答える 3

7

のソースコードにArrays.sort()は次のショートカットがあるため:

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

したがって、要素が 1 つしかない配列を並べ替える必要がないため、配列の要素が Comparable を実装しているかどうかを確認する必要はありません。

javadoc はClassCastException がスローされることを保証しないことに注意してください。

于 2013-03-16T14:28:48.567 に答える
2

要素が1つしかないため...そして、Array.sort()要素が2つ未満の場合、ソートせずに終了します

于 2013-03-16T14:29:49.120 に答える
0

その理由は、list には要素が 1 つしかなく、compareTo メソッドが Arrays.sort で呼び出されないため、要素が 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 に答える