1

我不明白 Java 中有什么愚蠢的东西,希望你能帮我弄清楚。

我已经定义Hashset<Point> myHashSet = new HashSet<Point>();

然后,我创建两个相等的 Point 点 ,Point p1 and Point p2并将它们放在不同的变量/内存位置。然后我重写 .equals() 方法public boolean equals(Point other)并将我的第一个点 p1 添加到 HashSet。

然后我打电话System.out.println(myHashSet.contains(p2)); // prints false

为什么编译器不能从创建时推断出“哦,这个哈希集的类型是 Point”,并说“我应该检查 Point 是否覆盖了默认的 equals 方法......是的,让我们称之为一个!” .

相反,我相信它调用对象的通用 equals 方法,从而比较内存位置,我相信?

这样做的原因仅仅是 HashSet 可以包含 Point 的子类,它使用不同的 Equals 方法吗?这是我能看到当前行为的唯一原因,尽管我确信我忽略了一些东西:)。非常感谢。

4

4 回答 4

6

Object.equals(Object)您必须覆盖的集合使用。如果您创建另一个方法,equals(Point)它不会调用它。

相反,我相信它调用对象的通用 equals 方法,从而比较内存位置,我相信?

是的,因为唯一HashSet可以通用调用的方法是equals(Object)

这样做的原因仅仅是 HashSet 可以包含 Point 的子类,它使用不同的 Equals 方法吗?

HashSet 无法知道您想在运行时使用此方法。

于 2013-03-28T12:20:18.417 回答
2

您应该根据此文档http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29覆盖 equals() 和 hashCode() ,因为 HashSet 使用这两种方法都可以检查对象是否相等

于 2013-03-28T12:21:36.613 回答
2

您的问题在于public boolean equals(Point other),因为这不是Object类中定义的默认 equals 方法。

public boolean equals(Object other)如果您希望 HashMap 使用您的实现,则必须覆盖(注意 Object 而不是 Point)。请参阅Object 的文档并注意,如果您覆盖,equals您也应该覆盖该hashCode()方法。

于 2013-03-28T12:23:11.010 回答
1

尝试添加@Override注释。您一定拼错了 equals 方法及其签名。

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }                
于 2013-03-28T12:25:28.687 回答