2013-04-02 77 views
1

我的Java代碼發生以下異常:什麼是比較合同?

java.lang.IllegalArgumentException: Comparison method violates its general contract! 

我研究了信息在計算器上,發現貼出自己寫得不好的比較方法的若干問題,但我想知道如果合同中寫入和究竟是什麼狀態關於比較方法必須做什麼。

+0

我想你應該發佈一些你的代碼,以獲得一些真正的幫助。 –

+1

你的代碼是什麼樣的? –

+0

可能的重複[here](http://stackoverflow.com/q/11441666/823393)。 – OldCurmudgeon

回答

5

看起來Java Doc有它

實現程序必須確保SGN(比較(X,Y))== -sgn(比較(Y,X))對於所有的x和y。 (這意味着比較(X,Y)必須拋出一個異常,當且僅當比較(Y,X)拋出 例外)。

實現類還必須確保關係是可傳遞: ((比較( x,y)> 0)& &(比較(y,z)> 0))意味着比較(x,z)> 0。

最後,實現者必須確保compare(x,y)== 0意味着對於所有z,sgn(compare(x,z))== sgn(compare(y,z)) 。

通常是這樣,但並非嚴格要求(比較(x, y)== 0)==(x.equals(y))。一般來說,任何違反此條件的比較器都應清楚地表明這一事實。 推薦的語言是「注意:此比較器強制排列 與等號不一致。」

+2

WHo會相信 - 比較器的API文檔隱藏在Comparator的API文檔中。 –

+0

@ TomHawtin-tackline:我認爲只有John Skeet可以知道這一點。 – xyz