我使用前面声明的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)
答案 0 :(得分:9)
您传递的Comparator
可能是null
。
Javadoc声明:
@param
c
比较器确定列表的顺序。null
值表示应使用元素'自然排序。
如果Comparable
是Comparator
,那么假设参数为null
。 Arrays.sort
中的代码与此一致。我认为如果Comparator
是null
,它确实应该抛出NPE,但它是方法合同的一部分,因此无法更改。