2011-07-28 57 views
4

我使用我之前聲明的比較器調用ArrayList上的Collections.sort()。什麼可能導致Collections.sort(列表<T>,比較儀<? super T>)拋出ClassCastException?

ArrayList<Employee> list = new ArrayList<Employee>(); 
Comparator<Employee> comparator = new Comparator<Employee>() { 

    public int compare(Employee o1, Employee o2) { 
    return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); 
    } 

}; 

... 

Collections.sort(list, comparator); 

出於某種原因,排序是想投我的ArrayList元素可資比較,即使我通過一個比較。爲什麼會發生這種情況?

如果它是任何使用的,這裏是我的堆棧跟蹤

Exception in thread "Thread-3" java.lang.ClassCastException: processing.app.EmployeeManager$PrettyOkayEmpolyee cannot be cast to java.lang.Comparable 
    at java.util.Arrays.mergeSort(Unknown Source) 
    at java.util.Arrays.sort(Unknown Source) 
    at java.util.Collections.sort(Unknown Source) 
    at foobar.Main.doSomeSorting(Main.java:140) 
    ... 
    at java.lang.Thread.run(Unknown Source) 
+0

發佈您的信息。 – Falmarri

+0

沒有看到代碼就很難告訴你什麼是錯的。發佈'Flub'和比較器的定義。 –

回答

9

Comparator你傳遞可能是null

的Javadoc指出:

@param c比較,以確定該列表的順序。 A null值表示應該使用元素'自然排序

所以它會假設參數是Comparable如果ComparatornullArrays.sort中的代碼與此一致。如果Comparatornull,我認爲它確實應該拋出一個NPE,但它是該方法合同的一部分,因此不能更改。

+1

...這是!我會期待一個NullPointerException。傻我。 – peskal

+0

@ColinD謝謝。我花了一個小時在我的代碼後面,確認我確實向我使用的TreeSet提供了一個Comparator,並且只有您在這裏的答案讓我檢查它實際上不是null。我在這個類的靜態單例實例之後愚蠢地聲明瞭一個靜態比較器**。因此,在構建TreeSet時,單例看到比較器的值爲空值。 – Bobulous

相關問題