什么可能导致 Collections.sort(List, Comparator super T>) 抛出 ClassCastException?
我使用我之前声明的比较器在 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);
由于某种原因,排序试图将我的 ArrayList 的元素转换为可比较对象,即使我传递了一个比较器。为什么会发生这种情况?
如果有任何用处,这是我的堆栈跟踪
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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您传递的
Comparator
可能为null
。Javadoc 指出:
因此,如果
Comparator
为null
,则假定参数是Comparable
。Arrays.sort
中的代码与此一致。我认为如果 Comparator 为 null ,它确实应该抛出 NPE,但它是方法契约的一部分,因此无法更改。The
Comparator
you passed is probablynull
.The Javadoc states:
So it's going to assume the arguments are
Comparable
if theComparator
isnull
. The code inArrays.sort
is consistent with this. I think it really ought to throw a NPE if theComparator
isnull
, but it's part of the contract of the method and so can't be changed.