【发布时间】:2013-03-18 21:00:15
【问题描述】:
我不懂 Java 中的一些愚蠢的东西,希望你能帮我弄清楚。
我已经定义了Hashset<Point> myHashSet = new HashSet<Point>();
然后,我创建两个相等的 Point 点,Point p1 and Point p2,并将它们放在不同的变量/内存位置。然后我覆盖public boolean equals(Point other) 的.equals() 方法,并将我的第一个点p1 添加到HashSet。
然后我打电话给System.out.println(myHashSet.contains(p2)); // prints false
为什么编译器不能从创建时推断“哦,这个哈希集的类型是 Point”,并说“我应该检查 Point 是否覆盖了默认的 equals 方法......是的,我们称之为一个!”。
相反,我相信它调用对象的通用 equals 方法,因此我相信比较内存位置?
这样做的原因仅仅是 HashSet 可以包含 Point 的子类,它使用不同的 Equals 方法吗?这是我能看到当前行为的唯一原因,尽管我确信我忽略了一些东西:)。非常感谢。
【问题讨论】:
-
你也覆盖了 hashCode 吗?
-
@EvanKnowles 我知道这也必须这样做,我更多的是问为什么 Java 不能从我创建的 HashSet 推断“这个 HashSet 只包含 Point 类型的对象,所以我应该'不要使用 Object equals 方法,我应该使用 Point one" :)
-
啊 - 正如彼得所说,我相信您没有正确覆盖 equals 方法。你已经重载了它。
标签: java object collections hash equals