java.util.Arrays.sort(Object[] a) に オブジェクトの配列を渡してソートしようと思った。
で、Comparator インターフェースを実装したオブジェクトの配列を渡したら、


java.lang.ClassCastException
    at java.util.Arrays.mergeSort(Arrays.java:1152)
    at java.util.Arrays.mergeSort(Arrays.java:1163)
    at java.util.Arrays.sort(Arrays.java:1079)

と例外が出た。
実は、Comparator ではなく Comparable を実装する必要があった。

まぎらわしいことに、Arrays クラスの sort メソッドは2つあって、
ひとつは、Comparable を実装したオブジェクトが必要で、
もうひとつは、Comparator を実装したオブジェクトが必要になる。

Comparable → Arrays.sort(Object[] a)
Comparator → Arrays.sort(Object[] a, Comparator c)

JDK1.4のドキュメントには、

Arrays.sort(Object[] a)では、「配列のすべての要素は、Comparable インタフェースを実装している必要があります。」とあり、
Arrays.sort(Object[] a, Comparator c)では、「指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートします。」と書いてある。


コメント

NI-Lab.たちが、ドキュメントとかをComparableしなかった?


tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)