我遇到了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()。
有什么想法吗?
祝你好运, 迪特里希
答案 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?