0

我正在尝试比较迭代器中 x 的 2 个实例的值。

x 是包含自己的数据成员的引用类型。我正在尝试将 x 的一个实例与另一个实例进行比较,以确定每个实例中的值是否相同。

如果(x.等于(x))

当 x 的每个实例的实际值不同时,继续评估为真。

干杯。

4

6 回答 6

8

假设您的代码看起来并不像这样

X x = new X();
if(x.equals(x))

但更像

X x = new X();
X y = new X();

if(x.equals(y)) { }

而且你得到了错误的值,x.equals(y)那么你对 equals 的实现就被破坏了。

转到您的Class X并检查 equals 是如何实现的。如果未在 X 中实现,请检查超类。

于 2009-07-09T01:52:20.820 回答
1

这是一个很难用给出的细节来回答的问题。它们必须是对象而不是基元才能具有 .equals 方法。那么是否以导致错误比较的方式覆盖了 equals 方法?那将是我要看的地方。

于 2009-07-09T01:46:33.650 回答
0

听起来您正在比较参考而不是数据。

编辑:来自 Object 的 API 文档:“Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和y 指的是同一个对象(x == y 的值为 true)。"

例如,如果'X' 或其父类没有覆盖equals,那么当您调用equals 时,它将比较引用,如果它们是同一个对象,则它们将始终是相等的。

听上去你需要重写类'X'中的equals方法,但话又说回来,你所说的似乎表明它们无论如何都是相同的引用?

于 2009-07-09T01:47:19.560 回答
0

类中的equals方法Object执行实例等于操作。然而,对于 的子类来说,Object重写此方法以执行相对等于操作是很常见的,其中目标对象中的值会根据相关对象的值进行测试。在您的情况下,您很可能使用了Object覆盖该equals方法的子类。最好知道equals您的类的方法是如何X实现的。

于 2009-07-09T01:50:06.470 回答
0

我将假设您的两个 X 对象实际上是不同的对象,而不是错误的同一个对象。在这种情况下,问题在于该类的 equals() 实现。检查您的类及其超类是否有 equals() 实现,并确保其实际进行智能比较。如有必要,请自己编写。

class Square
{
    public int length;

    public boolean equals( Square s )
    {
        return this.length == s.length;
    }
}
于 2009-07-09T01:55:18.697 回答
0

如果你决定重写equals( ),也要重写hashcode()

于 2009-07-09T02:43:16.960 回答