4

以前に宣言した 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);

何らかの理由で、Comparator を渡したにもかかわらず、sort が ArrayList の要素を Comparables としてキャストしようとしています。なぜこれが起こっているのでしょうか?

それが役に立ったら、ここに私のスタックトレースがあります

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)
4

1 に答える 1

9

あなたComparatorが合格したのはおそらく nullです。

Javadoc には次のように記載されています。

@paramcリストの順序を決定するコンパレータ。null値は、要素の自然順序付けを使用する必要があることを示します。

したがって、引数がComparableif であるComparatorと仮定しますnull。のコードはArrays.sortこれと一致しています。Comparatorが の場合は本当に NPE をスローする必要があると思いますがnull、それはメソッドのコントラクトの一部であるため、変更できません。

于 2011-07-28T23:58:41.393 に答える