在equals方法中避免使用instanceof的可行方法?

时间:2012-11-21 16:00:19

标签: java equals instanceof

很多人不喜欢使用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来测试ObjectA?还是有其他我不想的问题?

3 个答案:

答案 0 :(得分:7)

  

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

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

你可以写

@Override
public boolean equals(Object o) {
    return o instanceof A && n == ((A) o).n;
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这段代码重载不会覆盖equals。另外不要忘记检查o == null。替换为instanceof包括getClass()。equals(other.getClass())并使用A.isAssignableFrom(other.getClass())