Si encuentras algún error con tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.
Solución:
En Kotlin, hay dos tipos de igualdad disponibles. Estos son: Igualdad Estructural & Igualdad Referencial.
class A
var foo = 1
var a1 = A()
var a2 = A()
Aquí a1
y a2
son dos instancias de clase A
.
println(a1 == a2)
se imprime false
porque a1
y a2
no son estructuralmente iguales.
println(a1 === a2)
se imprime false
porque a1
y a2
no están haciendo referencia al mismo objeto.
Pero, si ejecutas esta línea: a1 = a2
entonces,
a1 y a2 serán estructuralmente iguales y a1 hace referencia a la instancia a2. Es por eso,
println(a1 == a2)
println(a1 === a2)
ambas líneas devuelven true.
En pocas palabras, de los documentos:
En Kotlin hay dos tipos de igualdad:
- Igualdad estructural (una comprobación de
equals()
) =>==
- Igualdad referencial (dos referencias apuntan al mismo objeto) =>
===
Respuesta detallada:
Igualdad estructural (==
)
La contraparte negada de ==
es !=
Por convención, una expresión como a == b
se traduce a:
a?.equals(b) ?: (b === null)
Si a
no es null
, llama a la equals(Any?)
función, de lo contrario comprueba que b
es referencialmente igual a null
.
Para proporcionar una implementación personalizada de verificación de igualdad, anular el equals(other: Any?): Boolean
función. Las funciones con el mismo nombre y otras firmas, como equals(other: Foo) , no afectan las comprobaciones de igualdad con los operadores ==
y !=
.
Igualdad referencial (===
)
La contraparte negada de ===
es !==
a === b
evalúa a true
si y solo si a
y b
señalar el mismo objeto. Para valores que se representan como tipos primitivos en tiempo de ejecución (por ejemplo, Int
), el ===
verificación de igualdad es equivalente a la ==
cheque.
Explicación del código
Supongamos la definición de A
es como lo ha definido en su pregunta.
Fragmento 1
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2 // a1 and a2 are different instances of A
false
>>> a1 == a1
true
>>> a2 == a2
true
>>> a1 === a2 // a1 and a2 have references to different objects
false
Para las clases regulares, la implementación de equals
se hereda de Any
, y simplemente hacer que el objeto sea igual a sí mismo.
Fragmento 2
>>> var a1 = A()
>>> var a2 = A()
>>> a1 = a2
>>> a1 == a2
true
>>> a1 === a2
true
a1
y a2
apuntar al mismo objeto por eso a1 == a2
y a1 === a2
regreso true.
Fragmento 3
vamos a anular equals(Any?)
de A
como sigue:
class A
var foo = 1
override fun equals(other: Any?): Boolean
if (other == null
Ahora vamos a ejecutar lo siguiente:
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2
true
>>> a1 === a2
false
Darse cuenta de a1
y a2
son estructuralmente iguales a pesar de que hacen referencia a objetos de diferencia.
Puedes añadir valor a nuestro contenido informacional colaborando tu veteranía en las observaciones.