什么是比较合同?

时间:2013-04-02 13:17:56

标签: java comparator

我的java代码引发了以下异常:

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

我研究了StackOverflow上的消息,并发现了一些问题,这些问题发布了他们写得不好的比较方法,但我想知道合同的编写地点以及它对于比较方法必须做什么的确切说明。

1 个答案:

答案 0 :(得分:6)

看起来Java Doc有它

  

实现者必须确保sgn(compare(x,y))==   所有x和y的-sgn(比较(y,x))。 (这意味着当且仅当compare(y,x)抛出时,compare(x,y)必须抛出异常   异常。)

     

实现者还必须确保关系是可传递的:   ((compare(x,y)> 0)&&(compare(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))。一般来说,任何比较器   违反这一条件应清楚地表明这一事实。该   建议的语言是“注意:这个比较器强制执行排序   与平等不一致。“