我正在学习Kotlin,具有C和Java背景 . 我期待以下打印 true
,而不是 false
. 我知道 ==
映射到 equals
. equals
的默认实现是否不比较每个成员,即 firstName
和 lastName
?如果是这样,它不会看到字符串值相等(因为 ==
再次映射到 equal
)?显然,在Kotlin还没有找到合适的地方 .
class MyPerson(val firstName: String, val lastName: String)
fun main(args: Array<String>) {
println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker"))
}
3 回答
您描述的默认
equals
实现仅适用于数据类 . 不适用于从Object
继承实现的常规类,只是使对象等于它自己 .参考平等
Java
在Java中,
equals
的默认实现比较变量的reference,这是==
always 的作用:我们称之为“ referential 平等” .
Kotlin
在Kotlin中
==
编译为equals
,而===
相当于Java的==
.结构平等
每当我们想要相当于结构而不是引用相等时,我们可以覆盖
equals
,正如你所建议的那样,默认情况下这对于普通类是永远不会完成的 . 在Kotlin中,我们可以使用data class
,编译器会根据构造函数属性自动创建一个实现(读here) .如果您覆盖
equals
(反之亦然) manually ,请记住始终覆盖hashCode
并坚持使用两种方法的非常严格的contracts . Kotlin的编译器生成的实现确实满足了 Contract .在您的情况下,
MyPerson
用于data class
,它自动生成通用方法的实现(toString
,equals
和hashCode
) .