4

我使用之前声明的 Comparator 在 ArrayList 上调用 Collections.sort()。

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

1 回答 1

9

你通过的Comparator大概是 null

Javadoc 指出:

@paramc比较器来确定列表的顺序。一个null值表示应该使用元素的自然顺序。

所以它会假设论点是Comparableif the Comparatoris null。中的代码Arrays.sort与此一致。我认为如果Comparatoris确实应该抛出 NPE null,但它是方法合同的一部分,因此无法更改。

于 2011-07-28T23:58:41.393 回答