Por qué los numbers que aceptan nulos no son para preservar la identidad

En kotlin nullable valores nullable no preservan la identidad sino la igualdad,

 val a: Int = 10000 val boxedA: Int? = a val anotherBoxedA: Int? = a print(boxedA === anotherBoxedA) // !!!Prints 'false'!!! print(boxedA == anotherBoxedA) // Prints 'true' 

Solo quería saber por qué es esto diferente?

a === b evalúa como verdadero si y solo si a y b apuntan al mismo object.

Eso no es cierto para boxedA === anotherBoxedA.

Kotlin – Igualdad

Esto se explica en la documentation justo al lado de este ejemplo de código:

Tenga en count que el boxeo de numbers no necesariamente preserva la identidad

Básicamente, ¿usando el Nullable Int? tipo obliga al comstackdor a utilizar el tipo de Integer para esas variables en el bytecode generado en lugar de la primitiva int . Entonces, el ejemplo de código se traduce a este código de Java:

 int a = 10000; Integer boxedA = Integer.valueOf(a); Integer anotherBoxedA = Integer.valueOf(a); System.out.print(boxedA == anotherBoxedA); 

Esto, por supuesto, imprime false , ya que dos instancias Integer diferentes han sido creadas por las dos llamadas Integer.valueOf . Aunque la JVM ha almacenado en caching las instancias creadas por llamadas Integer.valueOf , solo funciona entre -128 y 127 , si ejecuta el código con un valor en ese range, ambas comparaciones serán true .

La igualdad referencel significa que dos references apuntan al mismo object.

Documento , la igualdad referencel se comtesting mediante la operación === (y su contraparte negada! ==). a === b evalúa como verdadero si y solo si a y b apuntan al mismo object.

En kotlin, tenemos dos conceptos diferentes de igualdad, igualdad referencel e igualdad estructural

Igualdad referencel

Usamos el símbolo === que nos permite evaluar la reference de un object (si apunta al mismo object). Esto es un equivalente del operador "==" en java. por eso boxedA === anotherBoxedA return false (Porque son dos objects separados, cada uno apuntando a una location diferente en la memory).

Igualdad estructural

Usamos el símbolo == que evalúa si ambos valores son iguales (o iguales). Esto generalmente se logra implementando el método equals() en java. Es por eso que boxedA == anotherBoxedA devuelve true

  • Clase Kotlin no encontrada
  • Extienda la comprobación de Mockito para que Kotlin no funcione (de manera "kotlin")
  • No se puede acceder a EditText u otros componentes de la interfaz de usuario con Kotlin
  • Android Studio 3 no puede build fragments de kotlin
  • En Kotlin Lenguaje de progtwigción importancia de varargs en términos de usos
  • Prueba unitaria de la function de extensión de Kotlin en las classs de Android SDK
  • ¿Cuál es el equivalente de este código de java a kotlin
  • Obligatorio <Objeto> y encontrado <Objeto>?
  • Extensión sintética Kotlin para ver
  • Clases de Kotlin sin llaves