为什么equals不是java.util.Comparator中必须实现的?
无论是在Javadoc中还是在代码本身中,Comparator接口都定义了:为什么equals不是java.util.Comparator中必须实现的?,java,interface,comparator,Java,Interface,Comparator,无论是在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
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) {
//..
}
};
如何使接口不允许我们重写方法?首先,您应该实现此方法:
此外,只有当指定的对象也是一个比较器并且它施加了与该比较器相同的顺序时,该方法才能返回true。因此,comp1.equals(comp2)
意味着sgn(comp1.compare(o1,o2))==sgn(comp2.compare(o1,o2))
对于每个对象引用o1
和o2
但后来:
请注意,不重写Object.equals(Object)
始终是安全的
即使它是接口的一部分,怎么可能不重写equals()
?因为这个方法已经为Java()中的每个对象实现了
接口中的声明只是为了通过添加额外的JavaDoc解释来强调equals()
对于Comparator
的重要性
顺便说一句,如果您的比较器是无状态的,那么您应该只有一个比较器实例-在这种情况下,默认的
equal()
实现很好。因为每个对象都已经实现了equals()
实际上,在Comparator接口定义中再次指定equals()除了给记录契约及其与compareTo()的关系的机会之外,什么也做不到。我已经阅读了第二部分,但我的意思是,交互扩展对象是否也像普通的可更新实例一样?或者你的意思是一个接口知道什么方法可以在任何对象中实现,所以它不会强制它们吗?@user1352530实际上也不是。接口不知道
对象
。但在实现接口时,总是直接或间接地从对象继承。这意味着您已经继承了equals()
和其他文件,因此编译器不会抱怨。另一方面,请注意,当您拥有任何接口的实例时,您仍然可以调用该接口上的任何对象
方法,而不仅仅是该特定接口的方法。