2017-02-13 3 views
1

私は抽象クラスCandidateProgramを持っています。これはComparableインターフェイスを実装しています。'比較メソッドは、過渡的なエラーの兆候なしで一般的な契約に違反しています。

私のコードの中にはでソートするGRCandidateProgramというサブクラスのリストがあります。私がソートすると、エラー "java.lang.illegalArgumentException:比較メソッドは、その一般的な契約に違反します!"

私がオンラインで見つけた唯一の答えは、compareToメソッドの推移的なエラーが原因である可能性がありますが、これは私のコードでは当てはまりません。次のように私のcompareTo方法は次のとおりです。ノートのも

@Override 
public int compareTo(final CandidateProgram o) { 
    if (o == null) { 
     throw new NullPointerException("cannot compare to null"); 
    } 

    final Double thisFitness = getFitness(); 

    return thisFitness.compareTo(o.getFitness()); 
} 

:エラーは、私は、ソート、唯一時々私は任意のルールを決定することはできませんけれども入力がないエラーをトリガとすると毎回スローされません。たとえば、以下の適応度を持つリストでGRCandidateProgramの50個のインスタンスは、このエラーが発生することが表示されます。

3.0, 37.0, 70.0, 75.0, 80.0, 128.0, 161.0, 167.0, 172.0, 219.0, 253.0, 258.0, 263.0, 311.0, 344.0, 349.0, 355.0, 397.0, 402.0, 435.0, 441.0, 446.0, 488.0, 493.0, 527.0, 532.0, 537.0, 580.0, 585.0, 618.0, 624.0, 671.0, 676.0, 710.0, 715.0, 762.0, 768.0, 801.0, 806.0, 854.0, 859.0, 887.0, 892.0, 898.0, 945.0, 950.0, 971.0, 979.0, 984.0, 989.0

誰もがこの問題を解決する方法について何かアドバイスはありますか?

+0

FWIW、ヌルチェックは必要ありません - あなたはかなり明確な場所で 'o'を逆参照しようとするNPEを得るでしょう。 – chrylis

+0

'getFitness()'の宣言された型は何ですか? – chrylis

+0

@chrylis:double(プリミティブ型) –

答えて

0

回答は@shmoselによってコメントで提供されました。 getFitness()は現実世界の測定値を取ったため、呼び出しごとに異なる2倍の値を返しました。これは壊れるComparableの契約

関連する問題