【发布时间】:2013-11-04 00:43:00
【问题描述】:
编辑
我做得很糟糕,并且提供了不完整的信息供任何人确定我的问题的原因。真正的问题是我在 Animal 中有一个嵌套类,它有自己的 .equals ,它在其外部类型上调用 .equals 。 (因此,从嵌套类的 .equals 中调用 .equals on animal 调用 .equals on animal)。
我在继承树中有三个类。假设他们是Animal --> Dog<Owner> --> DogWithHumanOwner。
所以 DogWithHumanOwner 是通用 Dog 的一个实现,它专门为其所有者提供了一个 Human。
我已经覆盖了 Animal 和 Dog 的 .equal 方法。 Dog 的 .equal 方法如下所示:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
[other stuff]
return true;
}
我实际使用的是 DogWithHumanOwner。似乎当我尝试比较两个DogWithHumanOwner的相等性时,dogWithHumanOwner继承了Dog<Owner>的equals方法,它调用了super.equals,也就是dogWithHumanOwner的超类的.equals方法,也就是它所在的方法,等等它会导致递归循环和堆栈溢出。
(我不需要比较 Dog<Owner> 类的实现的任何特定属性,因为我在 Dog<Owner> 中这样做,并且所有者需要有适当的 equals 方法。)
编写避免此问题的 .equals 方法的最佳做法是什么?我在画一个空白。我应该只手动测试相等性而不调用 super 吗?
编辑:我不得不删除 BlackLabs,因为我为什么要使用 blackLabs 这样做是没有意义的。
【问题讨论】:
-
Dog的超类应该是Animal。调用其equals函数不应导致递归。 -
@Madbreaks - 请注意,
BlackLab.equals未 被覆盖,因此它默认为Dog.equals,即super.equals,因此是Dog.equals,因为BlackLab.super是Dog. -
@OldCurmudgeon 在
Dog中对super.equals的调用将始终解析为Animal.equals(它不会根据运行时类型而改变)。 -
呃,有谁知道
-
@CorayThan 使用带有`字符的内联代码格式,例如`Dog
`格式为 Dog<Owner>。你也可以使用 <和>对于 .