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

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上调用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);

您传递的
比较器
可能是
null

Javadoc声明:

@param
c
用于确定列表顺序的比较器。
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)