java为什么要将equals方法输入参数设为Object

我正在阅读一本关于数据结构的书。 目前我在图表上,下面的代码是图表的顶点部分。

class Vertex{ //bunch of methods public boolean equals(Object o){ //some code } } 

当我尝试实现这个equals方法时,我的编译器抱怨没有检查参数的类型,只是允许发送任何对象。 对我来说,为什么该参数不应该是Vertex而不是Object,这似乎有点奇怪。 有没有理由为什么作者这样做或者这是一个错误或过时的例子?

 @Override public boolean equals(Object obj) { if(obj == null) return false; else if (!(obj instanceof Vertex)) return false; else return // blah blah } 

equals(Object)是root – Object中定义的方法。 如果您不完全匹配签名,当有人检查两个对象是否相等时,将调用Object的版本。 不是你想要的。

你可能已经看过其他方法(如比较器),你可以使用确切的时间。 那是因为这些API是通用的,与Java 5相同。等于不能是因为用两种不同类型调用equals是有效的。 它应该返回false,但它是有效的。

equals是一个从Objectinheritance的方法,被定义为足够灵活,以便您可以接受任何对象并测试它是否等于任何其他对象(正如它应该能够做的那样),那么它怎么可能是任何其他方式?

编辑1

来自jhlu87的评论:
那么编写一个具有顶点输入参数的equals方法是不是很好的forms?

我们欢迎您为任何方法创建自己的重载,包括equals,但这样做而不更改名称可能会使许多人认为您的equals是从Objectinheritance的那个混淆。 如果它是我的代码并且我想要一个更具体的equals方法,我将它命名为与“equals”略有不同,只是为了避免混淆。

这是因为这种方法generics之前就存在了,所以对于后向兼容性,它必须保持这种方式。

强加类型的标准解决方法是:

 return obj instanceof MyClass && ; 

这是因为作者压倒了平等。 Equals在java.lang.Object中指定,并且是所有类inheritance的东西。

请参阅java.lang.Object的javadoc