Operador interesante '===' en Kotlin

¿Qué operador '===' hacer en Kotlin? ¿Como funciona? ¿Podemos verificar la igualdad de reference?

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

pero en el caso:

 var a : Int = 1000 var b : Int = 1000 println(a === b) // print 'true' !!! 

val a: Int = 1000 y val b: Int = 1000 no está en el range -128..127 , pero aún === es verdadero o el comstackdor en algunos casos entiende que se puede tomar un valor?

Como se documenta , representa la Igualdad de Referencia :

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.

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

 fun main(args: Array<String>) { val number1 = Integer(10) // create new instance val number2 = Integer(10) // create new instance val number3 = number1 // check if number1 and number2 are Structural equality println(number1 == number2) // prints true // check if number1 and number2 points to the same object // in other words, checks for Referential equality println(number1 === number2) // prints false // check if number1 and number3 points to the same object println(number1 === number3) // prints true } 

Compare esto con el código de Java a continuación:

 public static void main(String[] args) { Integer number1 = new Integer(10); // create new instance Integer number2 = new Integer(10); // create new instance Integer number3 = number1; // check if number1 and number2 are Structural equality System.out.println(number1.equals(number2)); // prints true // check if number1 and number2 points to the same object // in other words, checks for Referential equality System.out.println(number1 == number2); // prints false // check if number1 and number3 points to the same object System.out.println(number1 == number3); // prints true } 

Tu ejemplo:

Además, como se documenta aquí , "el boxeo de numbers no preserva la identidad". Entonces, boxedA tendrá una identidad, pero anotherBoxedA tendrá otra. Ambos tienen igualdad estructural, pero no igualdad referencel.

¿Pero por qué el segundo funciona? Porque el tipo de Kotlin Int corresponde al tipo int Java. Las dos variables comparadas en el segundo ejemplo son los valores de tipo primitivo, no los objects. Por lo tanto, para ellos, la igualdad de reference es exactamente igual a la igualdad regular.