【问题标题】:Feasible way to avoid instanceof in equals method?在equals方法中避免instanceof的可行方法?
【发布时间】:2012-11-09 22:24:02
【问题描述】:

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

【问题讨论】:

  • 我很好奇,为什么不用instanceof?即使是使用EqualsBuilder 之类的示例也有instanceof
  • 没有找到不使用它的理由。我总是在游戏中使用它。
  • @Peter 是正确的,重载的方法不是动态绑定的,因此在典型用法中很少会调用此方法。 stackoverflow.com/questions/321864/…
  • 我没有反对instanceof,我只是好奇这个问题。

标签: java equals instanceof


【解决方案1】:

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

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

你可以写

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

【讨论】:

  • 是的。 instanceof 正是您应该在 equals 方法中使用的内容。
  • 看来你总是回答我的问题!再次感谢。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多