Что может вызвать Collections.sort (Список <T>, Компаратор) бросить ClassCastException? - PullRequest
4 голосов
/ 29 июля 2011

Я вызываю Collections.sort () для ArrayList, используя Comparator, который я объявил ранее.

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

По какой-то причине sort пытается преобразовать элементы моего ArrayList в Comparables, хотя я и прошел Comparator.Почему это может происходить?

Если это пригодится, вот моя трассировка стека

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)

1 Ответ

9 голосов
/ 29 июля 2011

Comparator, который вы передали, вероятно, null.

Javadoc сообщает:

@ param c компаратор, чтобы определить порядок списка.Значение null указывает, что следует использовать естественный порядок элементов .

Таким образом, предполагается, что аргументы равны Comparable, если Comparator равно null.Код в Arrays.sort соответствует этому.Я думаю, что действительно следует бросить NPE, если Comparator равен null, но это часть контракта метода и поэтому не может быть изменено.

...