Dab*_*ler 8 java equality operator-overloading operators kotlin
我正在学习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"))
}
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的编译器生成的实现确实满足了合同.
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的通用方法,其自动生成实现(toString,equals,和hashCode)。
equals您描述的默认实现仅适用于数据类.不适用于继承实现的常规类Object,只是使对象等于自身.
| 归档时间: |
|
| 查看次数: |
5043 次 |
| 最近记录: |