gpt4 book ai didi

java - 为什么Java中的equals()必须传递Object作为参数?

转载 作者:行者123 更新时间:2023-12-02 05:21:25 25 4
gpt4 key购买 nike

当我们在Java中重写equals()方法时,我知道Object需要是一个参数,但我想知道 - 为什么Object >?。

其次,假设我们重写 hashcode() 并实现 equals(),但将 equals() 中的参数设置为 MyClass 而不是 Object(MyClass 是我们重写其 equals() 方法的类)。如果我们使用HashMap,我们仍然会得到预期的行为吗?

更新:是的,它将重载而不是覆盖。但是如果我们使用带有重载的 equals() 的 HashMap 会发生什么?另外,我在相关帖子中没有找到答案。还是我明显遗漏了一些东西?

最佳答案

如果您编写的 equals() 方法的参数不是 Object,则您是在重载该方法,而不是覆盖它。

现在,对于 HashMap - HashMap 调用 equals 来比较键。比较的键的类型是Object。因此,如果您定义一个 equals() 方法,其参数不是 Object,则该方法将被 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 方法替换为:

    public boolean equals (SomeClass other)
{
if (other instanceof SomeClass) {
return this.privateMember==((SomeClass)other).privateMember;
}
else {
return false;
}
}

输出将为“未找到!”,这意味着我们的 equals 方法被忽略。

关于java - 为什么Java中的equals()必须传递Object作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com