Kotlin 中的平等

我正在学习Kotlin,具有C++和Java背景。我本来以为下面要打印的,而不是。我知道映射到.是否默认实现不比较每个成员,即 和?如果是这样,它不会看到字符串值相等(因为再次映射到)吗?显然,有一些与平等与身份有关的东西,我还没有在Kotlin中正确理解。truefalse==equalsequalsfirstNamelastName==equals

class MyPerson(val firstName: String, val lastName: String)

fun main(args: Array<String>) {
   println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker"))
}

答案 1

参照相等

爪哇岛

在Java中,比较变量引用的默认实现,这是始终执行的操作:equals==

类的方法在对象上实现最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一对象 ( 具有值 ) 时,此方法才会返回。equalsObjecttruex == ytrue

我们称之为“参照平等”。

科特林

在 Kotlin 中被编译为 ,而 等同于 Java 的 。==equals=====

结构平等

每当我们想要结构相等而不是参照相等时,我们就可以覆盖 ,正如您所建议的那样,默认情况下,对于普通类,这永远不会完成。在 Kotlin 中,我们可以使用 ,编译器会根据构造函数属性自动创建一个实现(请阅读此处)。equalsdata class

如果您手动覆盖(反之亦然),请记住始终覆盖,并坚持两种方法的非常严格的合同。Kotlin 编译器生成的实现确实满足了契约。hashCodeequals


答案 2

您描述的默认实现仅存在于数据类中。不适用于从 继承实现的常规类,而只是使对象等于自身。equalsAny