如何找出我是否在super.equals调用链中达到了Object?

时间:2012-09-26 07:20:38

标签: java equals superclass

我遇到了Class.getSuperclass()的问题。我想生成一个类层次结构,其中每个子类在将其属性与另一个类进行比较后,将equals请求传递给父类。使用这种方法,当我达到Object之上的级别时,我需要停止调用super.equals,因为Object执行了isSame比较而这不是我想要的。

假设我有这种层次结构:

class Child extends Parent {
    ...
    public boolean equals(Object other) {
        ... compare my attributes to other, if everything matches:
        if (myImmediateSuperIsObject()) {
           return true;
        } else {
           return super.equals(other)
        }
    }
}



class Parent extends Object {
    public boolean equals(Object other) {
        ... compare my attributes to other, if everything matches:
        if (myImmediateSuperIsObject()) {
           return true;
        } else {
           return super.equals(other)
        }
    }
}

问题是myImmediateSuperIsObject伪调用。怎么写呢? 当从Child.equals调用Parent.equals时,则在Parent内,this.getClass()。getSuperclass()不是Object,而是Parent。那是因为在调用getSuperclass()时,我们总是从实例的类开始,即Child。所以我可以通过递归调用getSuperclass来构建整个层次结构,直到我得到null,但是如何确定我是否只是在我的equals调用链中的Object之上?

重申一下,所有这些只是一个问题,因为我需要生成类层次结构。如果我手动编写,我当然知道我正在扩展对象并停止调用super.equals()。

有什么想法吗?

祝你好运, 迪特里希

2 个答案:

答案 0 :(得分:1)

你可以使用getClass()。getSuperClass()然后测试它的Object.class

示例:

class Animal {
    boolean myImmediateSuperIsObject() {
        System.out.println("I am " + getClass() + " and my parent is " + getClass().getSuperclass());

        return this.getClass().getSuperclass() == Object.class;
    }
}
class Horse extends Animal {
    boolean myImmediateSuperIsObject() {
        System.out.println("I am " + getClass() + " and my parent is " + getClass().getSuperclass());

        return this.getClass().getSuperclass() == Object.class;
    }
}
new Horse().myImmediateSuperIsObject();
new Animal().myImmediateSuperIsObject();

答案 1 :(得分:1)

由于您要比较对象层次结构中的属性,是否考虑过使用EqualsBuilder.reflectionEquals中的Commons Lang