使用多个instanceof测试覆盖equals()对于不同的对象是否可行?

时间:2011-10-28 09:12:46

标签: java equals instanceof

假设我有一个课程,我必须检查多种不同类型的对象。是否可行/可能以下列方式覆盖equals()

public boolean equals(Object o){
    if(o == null) return false;
    if(o instanceof class1){
        return this.class1.equals((class1) o);
    if(o instanceof class2){
        return this.class2.equals((class2) o);
    ...

}

这会有用吗?我在这里假设我在各自的类中创建了一个静态重载的equals()方法(尽管只要我转换,多态就会自动处理它)。

4 个答案:

答案 0 :(得分:3)

我非常怀疑,因为你很容易以这种方式违反平等的传递性(x.equals(y) && x.equals(z)暗示y.equals(z)

除非你在整个设置过程中涉及所有课程,但这样做会很难实现

答案 1 :(得分:1)

从语义上讲,我认为这不是一个好主意。 Equals不应该基于类类型而是基于实例变量。 除此之外,苹果不应该等于梨,而只能等于其他苹果。

答案 2 :(得分:1)

您似乎想要一种方法来检查指定对象是否至少等于接收器中的各种成员变量之一。

为此目的覆盖java.lang.Object#equals是不合适的。

您应该提供不同的方法,例如

public boolean hasEquals(Object o) { // your impl }

答案 3 :(得分:0)

如果您确定它不会导致相互递归,您只需返回that.equals(this)即可。但是一般来说,对象相等意味着类的相等,或者它们之间至少是一个连贯的继承关系。