4

앞서 선언 한 Comparator를 사용하여 ArrayList에서 Collections.sort()를 호출합니다. 어떤 이유 Collections.sort (List <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의 요소를 캐스팅하기 위해 노력하고있다. 왜 이것이 일어날 수 있습니까? 그것은 어떤 소용이 있다면

, 여기 null 아마 내 스택 트레이스

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이 전달됩니다.

Javadoc의 상태 :

@param c리스트의 순서를 결정하는 비교기. null 값은 '자연 주문 요소를 사용해야 함을 나타냅니다. Comparatornull 경우에 따라서는 인수 가정 것

Comparable 있습니다. Arrays.sort의 코드는 이와 일치합니다. Comparatornull 인 경우 NPE를 던져야한다고 생각합니다. 그러나 이는 계약서의 일부이므로 변경할 수 없습니다.

+1

... 그렇습니다! 나는 NullPointerException을 예상했을 것이다. 바보 나. – peskal

+0

@ColinD 고맙습니다. 내 코드를 따라 한 시간 씩 보냈는데 실제로 사용하고있는 TreeSet에 Comparator를 제공했음을 확인하고 여기에 나온 대답만으로 실제로 null이 아닌지 확인했다. 정적 인 비교 자 **를 클래스 **의 정적 싱글 톤 인스턴스 다음에 ** 바보로 선언했습니다. 그래서 Singleton은 TreeSet을 생성 할 때 Comparator에 null 값을보고있었습니다. – Bobulous

관련 문제