为什么比较器声明等于?

sag*_*nha 26 java lambda comparator java-8 functional-interface

Comparator接口有自己的equals()方法.equals()默认情况下,任何类都将通过Object类获取.equals()在接口中有什么方法需要?

aio*_*obe 10

Comparator完善合同Object.equals:它必须满足由Object.equals 一些人制定的约束条件.

此外,仅当指定的对象也是比较器并且它与此比较器施加相同的顺序时,此方法才能返回true.因此,comp1.equals(comp2)暗示sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))对于每个对象的引用o1o2.

声明equals内部Comparator允许您以javadoc的形式记录此内容.

请注意,API的文档也可作为合同,因此这里不仅仅是化妆品.这是其他代码和代码可以依赖的明确约束.

在类似情况下,您的方法较少,它也可以用作记录意图.即,Interface.method无论其超级接口如何发展,都应该存在.

  • 我不同意.该方法的要点是改进比较器的equals方法的契约:何时可以将比较器视为相等而何时不能.您可能认为没有比较器可以与任何其他比较器相等,但事实并非如此.如果两个比较器为任何参数返回相同的东西,你可能会认为两个比较器是相等的,但实际情况并非如此.javadoc明确表示你不需要重写equals,因为`Object.equals()`满足契约. (6认同)
  • 我现在更喜欢你的答案,但我仍然没有看到关于与Object类"解耦"的段落的要点.比较器*不需要这种方法. (4认同)

Kaz*_*ara 4

从Java文档来看,之所以Comparator有它自己的equals()方法:

然而,在某些情况下,重写此方法可以通过允许程序确定两个不同的比较器施加相同的顺序来提高性能。

  • 是的,但是在接口中提及方法仍然是多余的。 (5认同)