私のアプリケーションの 1 つで、Comparison メソッドがその一般的な契約に違反していることを示す IllegalArgumentException がスローされました。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124やhttp://www.oracle.com/technetwork/java/javase/compatibility-417013など、問題の詳細を示すソースをいくつか見つけました。 html#sourceで、アプリケーションでこれを修正したいと考えていました。
しかし、問題を再現できないため、修正が正しいかどうかわかりません。
再現するために、問題をできるだけ単純化しようと試み、次のような小さなクラスを作成しました。
public class Sortee implements Comparable<Sortee>
{
/** a value to sort by */
public final int _x;
public Sortee(int x)
{
_x = x;
}
public int compareTo(Sortee o)
{
return 1;
}
}
Comparator と同等のものも作成しました。
public class SorteeIncorrectComparator implements Comparator<Sortee>
{
public int compare(Sortee a, Sortee b)
{
return 1;
}
}
別のクラスでは、Sortee オブジェクトの List を作成し、Collections.sort() バリアントを呼び出して IllegalStateException を引き起こしました。
private static void sort()
{
List<Sortee> sortees = createSortees();
Collections.shuffle( sortees );
Collections.sort( sortees, new SorteeIncorrectComparator() );
Collections.shuffle( sortees );
Collections.sort( sortees );
}
しかし、IllegalStateException が発生することはありません。
Linux と Windows で試し、Java 1.7.0_21、23.21-b01 を使用して Windows の eclipse で試し、プロパティ java.util.Arrays.useLegacyMergeSort が設定されていないことを確認しました。
比較メソッドで常に 1 を返すことは、可換でも推移的でもないため、コントラクトを破る必要があると考えました。
IllegalStateException が発生しないのはなぜですか?