Java 什么可能导致Collections.sort(List<;T>;、Comparator<;?super T>;)抛出ClassCastException?
我使用前面声明的比较器在ArrayList上调用Collections.sort()Java 什么可能导致Collections.sort(List<;T>;、Comparator<;?super T>;)抛出ClassCastException?,java,collections,comparator,classcastexception,comparable,Java,Collections,Comparator,Classcastexception,Comparable,我使用前面声明的比较器在ArrayList上调用Collections.sort() ArrayList<Employee> list = new ArrayList<Employee>(); Comparator<Employee> comparator = new Comparator<Employee>() { public int compare(Employee o1, Employee o2) { return o1.ge
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);
您传递的
比较器
可能是null
Javadoc声明:
@paramc
用于确定列表顺序的比较器。null
值表示应使用元素的自然顺序
因此,如果
比较器
为null
,则假定参数是可比较的。数组.sort
中的代码与此一致。我认为如果比较器
为空
,它确实应该抛出一个NPE,但它是方法契约的一部分,因此不能更改。如果没有看到代码,就很难告诉您出了什么问题。发布Flub
和比较器的定义……事实就是如此!我本以为会出现NullPointerException。“我真傻!”科林,谢谢你。我花了一个小时跟踪我的代码,确认我确实为我正在使用的树集提供了一个比较器,只有您的回答让我检查它实际上不是空的。我愚蠢地在类的静态单例实例之后声明了一个静态比较器。因此,在构建TreeSet时,singleton看到比较器的值为空。
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)