为什么Java中的equals()必须作为参数传递给对象?
当我们在Java中重写为什么Java中的equals()必须作为参数传递给对象?,java,object,hashmap,equals,hashcode,Java,Object,Hashmap,Equals,Hashcode,当我们在Java中重写equals()方法时,我知道Object需要是一个参数,但我想知道-为什么Object 其次,假设我们重写hashcode()并实现equals(),但将equals()中的参数设置为MyClass,而不是Object(MyClass是我们重写的equals()方法的类)。如果我们使用HashMap,我们还会得到预期的行为吗 更新:是的,它将是重载而不是重写。但是如果我们对重载的equals()使用HashMap,会发生什么呢?另外,我在相关帖子中也找不到答案。或者我缺少
equals()
方法时,我知道Object
需要是一个参数,但我想知道-为什么Object
其次,假设我们重写hashcode()
并实现equals()
,但将equals()
中的参数设置为MyClass
,而不是Object
(MyClass
是我们重写的equals()
方法的类)。如果我们使用HashMap
,我们还会得到预期的行为吗
更新:是的,它将是重载而不是重写。但是如果我们对重载的equals()
使用HashMap
,会发生什么呢?另外,我在相关帖子中也找不到答案。或者我缺少的东西很明显吗?如果您编写的equals()方法的参数不是Object,那么您是在重载该方法,而不是重写它
现在,对于HashMap
-HashMap
调用等于比较键。比较键的类型为对象
。因此,如果您使用一个参数定义了一个equals()
方法,而该参数不是对象
,则该方法将被HashMap
忽略
我尝试了以下代码:
public class SomeClass
{
int privateMember;
// note it's important to override hashCode, since if the hashCode of two
// keys is not the same, equals() won't be called at all
public int hashCode ()
{
return privateMember;
}
public boolean equals (Object other)
{
if (other instanceof SomeClass) {
return this.privateMember==((SomeClass)other).privateMember;
}
else {
return false;
}
}
public static void main(String[] args)
{
HashMap<SomeClass,String> map = new HashMap<SomeClass,String>();
SomeClass s1 = new SomeClass ();
SomeClass s2 = new SomeClass ();
s1.priv=4;
s2.priv=4;
map.put (s1, "something");
if (map.containsKey (s2)) {
System.out.println ("found!");
} else {
System.out.println ("not found!");
}
}
}
输出将为“未找到!”,这意味着我们的
equals
方法被忽略。集合使用对象基类中的equals和hashcode方法。因此,您必须重写它们,以便自定义类提供实现。如果愿意,您可以重载equals,这适用于某些代码知道它正在处理MyClass
的实例的情况。然而,这会产生误导
所有集合类都设计用于处理Object实例,Object提供了通用的equals方法
您不应该真的需要直接编写equals方法。您可以使用IDE生成一个,也可以使用Apache Commons()中的EqualsBuilder来帮助将其组合在一起。“实现equals(),但将equals()中的参数设置为MyClass,而不是Object”-->那么您并没有覆盖
等于。我不完全确定链接的URL是否回答了OP的问题,即为什么对象是parameter@seteropere我只是浏览了一下,但我也没有找到答案。的确,但是我们会像链接的URL中提到的那样,在HashMap中出现同样的意外行为吗?当然。HashMap需要连接到Object.equals的东西,它必须接受Object类型的输入。感谢Eran和Ashley frieze的回答。帮了大忙。我想我现在明白了。
public boolean equals (SomeClass other)
{
if (other instanceof SomeClass) {
return this.privateMember==((SomeClass)other).privateMember;
}
else {
return false;
}
}