gpt4 book ai didi

java - 为什么equals和hashCode定义在Object中?

转载 作者:太空狗 更新时间:2023-10-29 22:54:37 26 4
gpt4 key购买 nike

决定将这些方法包含在 java.lang.Object 中的原因是什么?平等和散列对于许多类来说没有意义。

制作两个接口(interface)会更符合逻辑:

interface Equalable {
boolean equals(Equalable other);
}

interface Hashable extends Equalable {
int hashCode();
}

例如 HashSet 定义可能看起来像

class HashSet<T extends Hashable> ...

这将防止初学者常见的错误之一 - 使用一组项目而不实现 equals/hashCode。

最佳答案

当我们实现一个接口(interface)时,我们会注入(inject)(或接受)接口(interface)定义的契约。

Equalable & Hashable是两个不同的契约(Contract)。但如果我们仔细观察,就会发现它们都相互依赖,这意味着它们是 single interface 的一部分。 ,类似于 EqualableAndHashable .

现在明显的问题是,它们是否应该成为这个新 EqualableAndHashable 的一部分?接口(interface)或 Object

让我们一探究竟。我们有== (等于运算符)检查两个对象是否相等。 ==运算符确认两个不同的基元/对象的值/引用是否相等。但这并不总是可以通过检查 == 来回答。运营商。

现在的问题是,这个同样是契约的相等性是应该通过接口(interface)注入(inject)还是通过 Object 类的一部分注入(inject)?

如果我们看一下,我们不能只说这样的话:

TypeX does not guarantee the equality contract.

如果某些对象类型提供相等性而另一些不提供,这将变得困惑。这意味着 TypeX 的对象必须遵守对所有其他对象类型也适用的平等契约。因此,它不能从接口(interface)注入(inject)相等性,因为默认情况下,相等性应该是任何对象契约的一部分,否则会造成困惑。

所以我们需要对象来实现 equals .但它不能只实现 equals方法,它还需要实现 hashcode方法。

关于java - 为什么equals和hashCode定义在Object中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113752/

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