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

时间:2011-07-28 23:53:59

标签: java collections comparator classcastexception comparable

我使用前面声明的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。为什么会发生这种情况?

如果它有用,这是我的stacktrace

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 个答案:

答案 0 :(得分:9)

您传递的Comparator可能是null

Javadoc声明:

  

@param c比较器确定列表的顺序。 null值表示应使用元素'自然排序

如果ComparableComparator,那么假设参数为nullArrays.sort中的代码与此一致。我认为如果Comparatornull,它确实应该抛出NPE,但它是方法合同的一部分,因此无法更改。