2013-03-16 27 views
6

kod atma değildir: Java Doc uyarıncaArrays.sort (nesne []) 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 
    } 

} 

: doğal göre Arrays#sort

sıralar artan nesnelere belirtilen dizi elemanlarının sıralanması. Dizideki tüm öğeler numaralı Karşılaştırmalı arabirimini uygulamalıdır.

Neden Arrays#sort, JavaDoc tarafından belirtildiği gibi ClassCastException'u atmaz? Yani

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

bunun sadece sahip bir dizi sıralamak zorunda değildir, çünkü dizinin elemanları, Karşılaştırılabilir uygulamak olmadığını kontrol rahatsız etmez: Arrays.sort() kaynak kodu bu kısayolu Çünkü

cevap

7

bir eleman

Javadoc'un ClassCastException'ın atıldığını garanti garanti etmediğini unutmayın. sadece bir eleman var ... Ve az 2

+0

İlginç - Aynı şey Java 7 TreeMap "sabit", ancak görünüşe edildi Arrays'te değil ... – assylias

+0

Yani javadoc aldatıcı olabilir. – Apurv

2

, compareTo yöntemi Arrays.sort içinde çağrılan asla Böylece eleman hiçbir zaman Karşılaştırılabilir değil.

ama Collections.sort içinde zaten çağrılan:

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]); 
} 
} 

tüm elemnt uzanan T'ye döküm olan Karşılaştırılabilir

0

nedeni daha unsurlar varsa Array.sort() sıralama olmadan sona erecek liste sadece bir elemnt vardır Çünkü