重写 Java 的 equals() 方法:陷阱和解决方案
在最近的一次遭遇中,开发人员发现了重写 equals() 的一个令人困惑的问题( ) Java 中的方法。当仅使用其 ID 创建 Book 对象并将其传递给 equals() 方法时,就会出现问题。
重载与重写
Java 的 equals() 方法是从 Object 类继承为 public boolean equals(Object other);。当方法的签名(包括参数类型)与超类方法完全匹配时,就会发生重写。相反,重载涉及创建具有相同名称但参数类型不同的方法。
在这种情况下,开发人员最初实现了 equals() 的重载版本,该版本采用 Book 参数而不是 Object 参数。
ArrayList 对重写 equals() 的依赖
ArrayList,它在开发人员的代码,利用重写的 equals() 方法进行内容比较。尽管重载的 equals() 方法在大多数情况下运行良好,但它遇到了与 ArrayList 的兼容性问题。
问题原因
问题源于以下事实:重载的 equals() 方法无法匹配重写的 equals(Object) 方法的签名。因此,ArrayList 采用了 Object 的默认实现,不执行对象比较。
解决方案:正确重写 equals()
为了解决该问题,开发人员更正了重写的 equals() 方法采用 Object 参数,确保与ArrayList:
@Override public boolean equals(Object other) { if (other == null) return false; if (other == this) return true; if (!(other instanceof Book)) return false; Book otherBook = (Book) other; ...test other properties here... }
使用 @Override 注解有助于检测编译期间不正确的覆盖。
结论
此经验凸显了重要性在扩展类时遵守 Java 的方法重写约定。重载可能会导致兼容性问题,尤其是在使用 equals() 方法和集合(例如 ArrayList)时。正确的方法重写可确保一致性并避免不可预测的行为。
以上是为什么重载 Java 的 `equals()` 方法会破坏 `ArrayList` 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!