2

很多人不喜欢使用instanceof,但我发现在很多情况下,当涉及到该equals方法时,我们几乎没有其他选择。看看下面的课程:

class A {   
    int n;
    public A(int n) { this.n = n; }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    public boolean equals(A o) {
        return n == o.n;
    }   
}

我从来没有见过这样的事情,但它可以代替必须instanceof用来测试 anObject是否是 anA吗?或者还有其他我没有想到的问题?

4

3 回答 3

8

它可以替代必须使用 instanceof 来测试 Object 是否为 A 吗?

不,这是因为调用的方法是静态选择的,即仅equals(object o)在大多数情况下才会调用。

你可以写

@Override
public boolean equals(Object o) {
    return o instanceof A && n == ((A) o).n;
}
于 2012-11-21T16:02:42.283 回答
0

使用的集合、Swing 组件和其他类equals仍将调用equals(Object o)版本,并且将false始终返回。

该示例仅在显式调用该equals(A o)方法时才有效。

于 2012-11-21T16:04:49.230 回答
0

这个代码块是重载而不是覆盖equals。也不要忘记检查 o == null。instanceof 的替代方法包括 getClass().equals(other.getClass()) 和使用 A.isAssignableFrom(other.getClass())

于 2012-11-21T16:05:29.687 回答