我刚刚遇到了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 …