在Abstract类内部编写equals方法

时间:2019-04-22 23:28:47

标签: java abstract-class

因此,这更多是一个概念性问题。 我有抽象类A,类BC扩展了A

BC都在两个类中都只有1个实例变量,称为var,并且都具有.getVar方法。如果该对象是B的实例,并且两个实例的B值相等,则该对象等于var的实例。 C也是如此。

有没有一种方法可以在我的Abstract类中编写一个.equals(Object object)方法,这样我就不必在两个类中编写基本上具有相同功能的相同方法了?

2 个答案:

答案 0 :(得分:0)

假设A具有abstractgetVar()都提供实现的B方法C,我们可以在A#equals中利用它当两个对象相等时。因为只有类型B的对象可以等于另一个类型B的对象(C也是如此),所以我们可以简单地比较每个对象的类;如果类别不同,则它们不能相等。

// You didn't specify what type 'var' is.
// B and C both have an implementation for this method.
public abstract T getVar();

@Override
public final boolean equals(Object o) { // Is final so B and C can't override it.
    if (o == null) {
        return false;
    }

    if (getClass() != o.getClass()) {
        // This will ensure that B cannot be equal to C or A, and vice versa.
        return false;
    }

    // o must be of the type B or C, so it's safe to cast to A here.
    return getVar().equals(((A) o).getVar());
}

答案 1 :(得分:0)

基本上,您正在寻找的似乎是在父类getVar中定义抽象方法A并在子类B和{{1 }},并根据C返回的值使用父类的equals方法。每个子类对于getVar都有不同的返回类型,这使情况变得复杂。

解决方案是使getVar成为通用类,允许A本身的返回类型是通用的。然后,您可以简单地引用getVar中的getVar方法,而不必担心其特定类型:

equals

在上面的示例中,您会注意到public abstract class A<T> { public abstract T getVar(); @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + getVar().hashCode(); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; A<?> other = (A<?>) obj; return getVar().equals(other.getVar()); } } 返回通用类型getVar。在定义子类时将指定该名称:

T

仅此而已!除非您选择在子类中专门重写public class B extends A<Integer> { private int var = 0; public B(int var) { this.var = var; } @Override public Integer getVar() { return var; } } public class C extends A<String> { private String var = ""; public C(String var) { this.var = var; } @Override public String getVar() { return var; } } ,否则在子类的实例上调用equals时,它将退回到A中声明的方法。完整的测试用例包括在下面。

.equals