Igualdad en Kotlin

Estoy aprendiendo Kotlin, con un background C ++ y Java. Esperaba que lo siguiente fuera true , no false . Sé que == asigna a equals . ¿La implementación pnetworkingeterminada de equals no compara a cada miembro, es decir, firstName y lastName ? De ser así, ¿no vería los valores de cadena como iguales (ya que == maps equal a equal )? Aparentemente hay algo relacionado con la igualdad versus la identidad que todavía no tengo en Kotlin.

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

El valor pnetworkingeterminado equals implementación que describes solo existe para las classs de datos. No para classs regulares donde la implementación se henetworkinga de Object , y simplemente haga que el object sea igual a sí mismo.

Java

En Java, la implementación pnetworkingeterminada de equals compara la reference de la variable, que es lo que == siempre hace:

El método equals para la class Object implementa la relación de equivalencia más discriminatoria posible en los objects; es decir, para cualquier valor de reference no nulo x e y, este método devuelve verdadero si y solo si xey se refieren al mismo object (x == y tiene el valor verdadero).

Llamamos a esto "igualdad referencel ".

Kotlin

Aparte de en Java, Kotlin's == se comstack en equals , mientras que === es el equivalente de Java ==

Cuando queremos una igualdad más bien " estructural " que "referencel", podemos anular equals , lo que nunca se hace por defecto para las classs normales , como sugirió. Pero, en Kotlin podemos usar data class , que automáticamente nos proporciona una implementación 🙂

Por cierto, siempre tenga en count anular hashCode cada vez que anule equals (y viceversa) manualmente y apegarse a los contratos muy estrictos de ambos methods. Las implementaciones generadas por el comstackdor de Kotlin hacen esto también. No hay necesidad de preocuparse aquí.

== para la igualdad

En Java, puede usar == para comparar types primitivos y de reference. Si se aplica a types primitivos, Java == compara valores, mientras que == en types de reference compara references. Por lo tanto, en Java, existe la práctica bien conocida de llamar siempre a iguales, y existe el conocido problema de olvidar hacerlo.

En Kotlin, == es la forma pnetworkingeterminada de comparar dos objects: compara sus valores llamando a iguales bajo el capó. Por lo tanto, si se reemplaza equals en su class, puede comparar sus instancias con security utilizando ==. Para la comparación de reference, puede usar el operador ===, que funciona exactamente igual que == en 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" } 

En su caso, MyPerson se utiliza para ser una data class que autogenera implementaciones de methods universales ( toString , equals y hashCode ).