2013-03-16 16 views
6

KOD:Arrays.sort (obiektu []) nie rzuca ClassCastException

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 
    } 

} 

Zgodnie Java DOC Arrays#sort

sortuje określonej tablicy z przedmiotów w porządku rosnącym, w zależności od naturalnego porządkowanie jego elementów. Wszystkie elementy w tablicy muszą zaimplementować Porównywalny interfejs.

Dlaczego Arrays#sort, nie rzuca ClassCastException zgodnie z JavaDoc?

Odpowiedz

7

Ponieważ kod źródłowy Arrays.sort() ma ten skrót:

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

więc to nie przeszkadza sprawdzenie czy elementy tablicy wdrożyć porównywalne, ponieważ nie trzeba sortować tablicę, która ma tylko jeden element.

Należy zauważyć, że javadoc nie zapewnia gwarancji wywołania wyjątku ClassCastException.

+0

Ciekawe - to samo było "stałe" w TreeMap w Java 7, ale widocznie nie w tablicach ... – assylias

+0

Więc javadoc może zwodzić. – Apurv

2

Ponieważ ma tylko jeden element ... i Array.sort() zakończy bez sortowania jeśli istnieją elementy mniej niż 2

0

Powodem jest to, że lista zawiera tylko jeden elemnt, nigdy metoda compareTo wywoływany w Arrays.sort , więc element nigdy nie jest rzucany na porównywalne.

ale jest wywoływana w każdym razie w 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]); 
} 
} 

wszystko elemnt rzuca do T, która rozciąga się od Porównywalne