Saltar al contenido

¿Cuál es la diferencia entre == y === en kotlin?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *