在 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(工作:
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'!!!
所以我试图得到一个胶水,为什么引用等式"==="对数字>=128 显示"false",对 <128 显示"true"?
这来自JVM的Integer.valueOf(int)
实现方式:
此方法将始终缓存 -128 到 127(含(范围内的值,并可能缓存此范围之外的其他值。
因此,对于a = 127
,恒等box1 === box2
始终成立,而对于所有非byte
值,则可能不成立。