什么可能导致Collections.sort(List <T>,Comparator <?super T>)抛出ClassCastException?

pes*_*kal 4 java collections comparable classcastexception comparator

我使用我之前声明的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);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,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)
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 9

Comparator你通过可能是 null.

Javadoc说:

@param c比较器确定列表的顺序.甲null值表示元素的自然顺序应该被使用.

所以它会假设参数Comparable是否Comparatornull.代码Arrays.sort与此一致.我认为这真的应该抛出一个NPE如果Comparatornull,但它的方法的合同的一部分,因此不能被改变.