为什么在指定类型的HashSets中不能推断出equals?

Sim*_*ely 1 java collections hash equals object

我不懂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

为什么编译器不能从创建它时推断"哦,这个hashset是Point类型"并说"我应该检查一下Point是否覆盖了默认的equals方法......是的,让我们调用那个!" .

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

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

Pet*_*rey 6

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

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

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

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

HashSet无法知道您希望在运行时使用此方法.

  • a)它在运行时没有访问类b)如果你有一个接口,就没有办法在接口上定义一个equals方法.c)这对子类不起作用.d)如果它可以访问该类并使用反射来调用它,那将会慢得多.e)与一般的压倒性工作方式不一致. (3认同)
  • 泛型是一个编译时功能.所有HashSet的代码完全相同,每个HashSet都会调用相同的方法(等于)(对象)HashSet无法在运行时知道你使用`<Point>`我不是说它不可能设计,但它不是. (2认同)