为什么在java.util.Comparator中实现equals不是必须的? [英] Why is equals not mandatory to implement in java.util.Comparator?

查看:145
本文介绍了为什么在java.util.Comparator中实现equals不是必须的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Javadoc和代码本身中,Comparator接口定义:

  int compare(T o1,T o2) ; 
boolean equals(Object obj);

然后这不会给probs编译:

  Comparator a = new Comparator(){
@Override public int compare(Object o1,Object o2){
// ..
}
};

但这样做:

  Comparator a = new Comparator(){
@Override public boolean equals(Object comparator){
// ..
}
};

如何为界面做完以免我们覆盖方法?

解决方案

首先 JavaDocs明确说明你应该实现这个方法:


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


但后来:


请注意,不要安全override Object.equals(Object)


怎么可能不覆盖 equals(),即使它是接口的一部分?因为已经为Java中的每个对象实现了此方法( in Object class )。



声明接口只是通过添加额外的JavaDoc解释来强调 equals()对于 Comparator 的重要性。 / p>

BTW如果您的比较器是无状态的,您应该只有一个实例 - 在这种情况下,默认等于()实施就好了。


Either in Javadoc as well as the code itself, Comparator interface defines:

 int compare(T o1, T o2);
 boolean equals(Object obj);

But then this gives no probs compilating:

 Comparator a = new Comparator() {      
     @Override public int compare(Object o1, Object o2) {
        //..
     }
 };

But this does:

 Comparator a = new Comparator() {      
     @Override public boolean equals(Object comparator) {
        //..
     }
 };

How its done for the interface for allowing us not to override method?

解决方案

First of all JavaDocs explain clearly that you should implements this method:

Additionally, this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator. Thus, comp1.equals(comp2)implies that sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) for every object reference o1 and o2.

But later:

Note that it is always safe not to override Object.equals(Object).

How is it possible not to override equals(), even though it is part of an interface? Because this method is already implemented for each and every object in Java (in Object class).

The declaration in the interface is there only to emphasise the importance of equals() with regards to Comparator by adding extra JavaDoc explanation.

BTW if your comparator is stateless you should have only one instance of it - in which case the default equal() implementation is just fine.

这篇关于为什么在java.util.Comparator中实现equals不是必须的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆