所有子类的equals方法的抽象类

时间:2017-11-05 15:13:33

标签: java

我试图在抽象类中覆盖equals方法。有没有办法可以检查参数Object o是否是继承了该方法的类的实例,然后将类型转换为与继承了equals方法的类相同的类型?

这是我到目前为止所尝试的,但我收到的类型为java.lang.Object的错误变量。有没有理由认为o没有被强制转换? getOperand()  method返回复合类型。

@Override
public boolean equals(Object o){
    if (o.getClass() == this.getClass()){
        this.getClass().cast(o);
        return (o.getOperand().equals(this.getOperand()));
    }
    else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:2)

你需要:

  1. 将转换的结果分配给类引用类型,以便编译器能够找到getOperand方法,因为Object类没有这样的方法。
  2. 使用equals方法比较operand值,而不是使用==
  3. 使用instanceof以使解决方案支持混合类型相等。 (阅读Liskov Substitution Principle。如果您不想支持混合类型相等,则可选)
  4. equals方法标记为final,以防止子类覆盖它以支持对称性(如果x.equals(y)然后y.equals(x)。如果不支持混合,则不需要类型相等)

    public abstract class EqualsTest {
        public final boolean equals(Object o) {//make equals final to maintain symmetry
            if (o instanceof EqualsTest) {//use instanceof
                EqualsTest e = (EqualsTest)o;//cast and assign to EqualTest reference
                return e.getOperand().equals(this.getOperand());//use equals here
            } else
                return false;
            }
        }
    }       
    
  5. 通过上述更改,子类可以按原样继承equals方法:

    class EqualsTestSubClass extends EqualsTest {
          //inherts the equals and getOperand methods.      
    }
    
    class EqualsTestSubClass2 extends EqualsTestSubClass {
          //inherts the equals and getOperand methods.      
    }
    

    然后,您可以检查EqualsTestSubClass实例的相等性,EqualsTest实例是EqualsTestSubClass2EqualsTestSubClass实例的直接子类,它是EqualsTest e1 = new EqualsTestSubClass(); EqualsTest e2 = new EqualsTestSubClass2(); System.out.println(e1.equals(e2)); 实例的子类,如下所示:

    operand

    注意:最好直接比较equals方法中的getOperand字段,而不是使用getOperand,因为np.sqrt(7131 ** 5)np.sqrt(7132 ** 5)重写。