科特林的平等

Dab*_*ler 8 java equality operator-overloading operators kotlin

我正在学习Kotlin,具有C++和Java背景.我期待以下打印true,而不是false.我知道==那张地图equals.是否默认实现equals比不上每个成员,即firstNamelastName?如果是这样,它不会看到字符串值相等(因为再次==映射equal)?显然,有一些与平等和身份相关的东西,我还没有在Kotlin中找到.

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

fun main(args: Array<String>) {
   println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker"))
}
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 26

参考平等

Java的

在Java中,默认实现equals比较变量的引用,这是== 总是这样做的:

equals类的方法Object实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值x和y,true 当且仅当x 和y引用同一对象(x == y具有值true)时,此方法才返回.

我们称之为" 参照平等".

科特林

在Kotlin ==编译为equals,而===相当于Java ==.

结构平等

每当我们想要相当于结构而不是引用相等时,我们可以覆盖,正如你所建议的那样,默认情况下,对于普通类,equals永远不会被执行.在Kotlin中,我们可以使用,编译器会根据构造函数属性自动创建一个实现(在此处阅读).data class

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

  • 在 kotlin 中,您可以 **ctrl + 单击** `==` 运算符,您将看到它与 `equals` 相同,正如这个答案所示,如果您 **ctrl + 单击 ** `equals` 方法,您将看到还将看到指向相同实现的链接。 (2认同)

Chu*_*ulo 13

== 平等

在 Java 中,您可以使用 == 来比较原始类型和引用类型。如果应用于原始类型,Java 的 == 比较值,而引用类型的 == 比较引用。因此,在 Java 中,有众所周知的总是调用 equals 的做法,也有众所周知的忘记这样做的问题。

在 Kotlin 中,== 是比较两个对象的默认方式:它通过在底层调用 equals 来比较它们的值。因此,如果 equals 在您的类中被覆盖,您可以安全地使用 == 比较其实例。对于引用比较,您可以使用 === 运算符,其工作方式与 Java 中的 == 完全相同。

class MyPerson(val firstName: String, val lastName: String){
    override fun equals(other: Any?): Boolean {
        if (other == null || other !is MyPerson) return false
        return firstName == other.firstName && lastName == other.lastName
    }
}

fun main(args: Array<String>) {
    println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker")) // print "true"
}
Run Code Online (Sandbox Code Playgroud)

在你的情况MyPerson是用来为一个data class的通用方法,其自动生成实现(toStringequals,和hashCode)。


JB *_*zet 7

equals您描述的默认实现仅适用于数据类.不适用于继承实现的常规类Object,只是使对象等于自身.

  • 因此,如果常规类未覆盖equals,则其本质上与调用===相同。 (2认同)