Kotlin ссылочного равенства для "байтовых" чисел - PullRequest
0 голосов
/ 01 июня 2018

В официальной ссылке Kotlin https://kotlinlang.org/docs/reference/basic-types.html#numbers я читал, что:

Обратите внимание, что бокс чисел не обязательно сохраняет идентичность

и пример, который показывает, какэто может быть представлено:

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

После некоторого спонтанного тестирования я понял, что это работает как следует для чисел байта (<128): </p>

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

Также в той же ссылке https://kotlinlang.org/docs/reference/equality.html Я обнаружил, что:

Для значений, которые представлены как примитивные типы во время выполнения (например, Int), проверка равенства === эквивалентна проверке == =

Но это не объясняет этот случай как для:

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

Поэтому я пытаюсь понять, почему ссылочное равенство "===" показывает "false" для чисел> =128 и «истина» для <128? </p>

1 Ответ

0 голосов
/ 01 июня 2018

Это происходит от того, как Integer.valueOf(int) реализовано для JVM :

Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127, включительно, и может кэшировать другие значения за пределами этого диапазона.

Таким образом, для a = 127 тождество box1 === box2 всегда остается истинным, в то время как для всех значений, отличных от byte, оно может и не быть.

...