相关疑难解决方法(0)

为什么Java的Area#equals方法不会覆盖Object#equals?

我刚刚遇到了Java java.awt.geom.Area#equals(Area)方法引起的问题.问题可以简化为以下单元测试:

@org.junit.Test
public void testEquals() {
    java.awt.geom.Area a = new java.awt.geom.Area();
    java.awt.geom.Area b = new java.awt.geom.Area();
    assertTrue(a.equals(b)); // -> true

    java.lang.Object o = b;
    assertTrue(a.equals(o)); // -> false
}
Run Code Online (Sandbox Code Playgroud)

经过一番头脑刮擦和调试后,我终于在JDK源代码中看到了该equals方法的签名Area如下所示:

public boolean equals(Area other)
Run Code Online (Sandbox Code Playgroud)

请注意,它不是 @Override普通equals方法Object,而是使用更具体的类型重载方法.因此,上面示例中的两个调用最终调用了不同的实现equals.

由于Java 1.2以来存在此行为,我认为它不被视为错误.因此,我更感兴趣的是找出为什么决定正确地覆盖该equals方法,但同时提供一个重载的变体.(另一个提示,这是一个真正的决定是没有覆盖hashCode()方法.)

我唯一的猜测是,作者担心缓慢equals的地区实现不适合放置比较时平等Area以s Set,Map等等.数据结构.(在上面的示例中,您可以添加a到a HashSet,虽然b等于a,但调用contains(b)将失败.)然后,为什么他们不仅仅以不与方法这样的基本概念冲突的方式命名可疑equals …

java equals

22
推荐指数
1
解决办法
545
查看次数

标签 统计

equals ×1

java ×1