2

我的java代码抛出了以下异常:

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

我研究了 StackOverflow 上的消息,发现了几个问题,这些问题发布了他们写得很糟糕的比较方法,但我想知道合同是在哪里写的,以及它究竟说明了比较方法必须做什么。

4

1 回答 1

6

看起来Java Doc

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

实现者还必须确保关系是可传递的: ((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。

最后,实现者必须确保 compare(x, y)==0 意味着所有 z 的 sgn(compare(x, z))==sgn(compare(y, z))。

通常是这样,但并不严格要求 (compare(x, y)==0) == (x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是“注意:这个比较器强加了与等于不一致的排序。”

于 2013-04-02T13:20:18.610 回答