在Javadoc和代码本身中,Comparator接口定义:
int compare(T o1, T o2);
boolean equals(Object obj);
然而,这并没有提供任何编译的程序:
Comparator a = new Comparator() {
@Override public int compare(Object o1, Object o2) {
//..
}
};
但这样做:
Comparator a = new Comparator() {
@Override public boolean equals(Object comparator) {
//..
}
};
它是如何为接口完成的,允许我们不要覆盖方法?
答案 0 :(得分:24)
首先JavaDocs explain显然你应该实现这个方法:
此外,仅当指定的对象也是比较器并且它与此比较器施加相同的顺序时,此方法才能返回true。因此,
comp1.equals(comp2)
表示每个对象引用sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
和o1
o2
。
但后来:
请注意,不要覆盖
Object.equals(Object)
始终是安全的。
如果它是界面的一部分,怎么可能不覆盖equals()
?因为已经为Java中的每个对象实现了此方法(in Object
class)。
界面中的声明仅用于通过添加额外的JavaDoc解释来强调equals()
对Comparator
的重要性。
顺便说一句,如果您的比较器是无状态的,那么您应该只有一个实例 - 在这种情况下,默认的equal()
实现就可以了。
答案 1 :(得分:0)
因为每个对象都已经实现了equals()。
实际上,在Comparator接口定义中再次指定equals()除了有机会记录合同及其与compareTo()的关系外,完全没有任何结果。