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

  • Quiero agregar mi versión de kotlin al proyecto Gradel
  • ¿Cómo funcionan las funciones de extensión de Kotlin?
  • El tipo Out-Projected 'ArrayList <*>' prohíbe el uso de 'public fun fun add (índice: Int, elemento: E): Unidad definida en java.util.ArrayList'
  • ¿Cuál es el equivalente de este código de java a kotlin
  • OnClick y TextView en Android Studio 3
  • ¿Cómo crear un button en Kotlin que abre una nueva actividad (Android Studio)?
  • La function Kotlin requiere nada, pero se define como un tipo diferente
  • Extensiones en Kotlin
  • Hacer clic en una vista de text para cambiar el fragment
  • Extienda la comprobación de Mockito para que Kotlin no funcione (de manera "kotlin")