Java 如何确定我是否已到达super.equals调用链中的对象?

Java 如何确定我是否已到达super.equals调用链中的对象?,java,equals,superclass,Java,Equals,Superclass,我对Class.getSuperclass()有问题。我想生成一个类的层次结构,其中每个子类在将其属性与另一个类进行比较后,将equals请求传递给父类。使用这种方法,当我达到对象上方的级别时,我需要停止调用super.equals,因为对象执行isSame比较,而这不是我想要的 假设我有这样的层次结构: class Child extends Parent { ... public boolean equals(Object other) { ... compa

我对Class.getSuperclass()有问题。我想生成一个类的层次结构,其中每个子类在将其属性与另一个类进行比较后,将equals请求传递给父类。使用这种方法,当我达到对象上方的级别时,我需要停止调用super.equals,因为对象执行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中,此.getClass().getSuperclass()不是对象,而是父对象。这是因为在调用getSuperclass()时,我们总是从实例的类开始,即子类。所以我可以通过递归调用getSuperclass来构建整个层次结构,直到得到null,但如何确定我是否在equals调用链中的Object之上呢

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

有什么想法吗

致以最良好的祝愿, Dietrich

您可以使用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();

由于要比较对象层次结构中的属性,是否考虑过使用from?

object
Parent
之间引入一个抽象类,将其定义为层次结构树的根?在该类中,您可以重写
equals
以不再执行任何操作。父类扩展对象。它不必测试其超类是否为Object。是的,这是不能改变的。因此,让孩子调用
super.equals()
“对象进行isSame比较,这不是我想要的。”你能举个例子说明这样做会有什么不同,或者这只是一个学术问题吗?我同意@JBNizet。Parent是Object的子类,因此不需要在equals()中检查。@JB Nizet,Adam Dyga:这段代码是生成的,因此会在所有子类中进行检查,尽管在手动编写的代码中不需要这样做。感谢您的回复。不幸的是,当从child调用equals,而我在parent中时,它就不起作用了。我对问题进行了编辑,使其更加清晰。非常好的解决方法!但是,在调用层次结构中,不可能找出当前调用级别中的确切类型super吗?您不需要在Object之前停止它:不会比较Object属性。如果所有属性都匹配,并且调用Object.equals,它将比较实例,而实例通常不相同,因此,尽管所有属性都匹配,equals将为false。这能更好地表达我的意思吗?如果reflectionEquals只适用于同一个实例,那么它将毫无用处。它比较了字段:它不使用equals。在向上移动超级层次结构时,似乎确实不可能找出我处于哪个继承级别。因此,您的变通方法是最有用的答案。顺便说一句,最后我能够调整生成器-在UML模型中,可以确定我是否是顶级的。