2013-03-16 15 views
6

Codice:Arrays.sort (oggetto []) non è gettare 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 
    } 

} 

Secondo Java Doc: Arrays#sort

ordinamenti matrice specificata di oggetti in ordine crescente, secondo l' naturale ordinamento dei suoi elementi. Tutti gli elementi dell'array devono implementare l'interfaccia Comparable.

Perché Arrays#sort non invia ClassCastException come dichiarato da JavaDoc?

risposta

7

Poiché il codice sorgente di Arrays.sort() trovi questa scorciatoia:

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

Quindi non si preoccupa verifica se gli elementi della matrice attuare Comparable, perché non deve ordinare un array che ha solo un elemento

Si noti che javadoc non garantisce che viene generata una ClassCastException.

+0

Interessante - la stessa cosa è stata "fissata" in TreeMap in Java 7, ma a quanto pare non negli array ... – assylias

+0

Quindi javadoc può essere ingannevole. – Apurv

2

perché ha solo un elemento ... E il Array.sort() finirà senza ordinare se non ci sono elementi meno di 2

0

La ragione è che la lista ha un solo elemnt, il metodo compareTo mai invocato in Arrays.sort , quindi l'elemento non viene mai assegnato a Paragonabile.

ma è invocato in ogni caso in 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]); 
} 
} 

tutti elemnt è colata a T che si estende da Paragonabile

Problemi correlati