4

我对 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()。

任何的想法?

最好的问候,迪特里希

4

2 回答 2

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();
于 2012-09-26T07:28:59.490 回答
1

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

于 2012-09-26T08:05:16.773 回答