1

kotlin nullable价值观中不是保持身份而是平等:

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

为什么这不同?

4

4 回答 4

3

a === b当且仅当 a 和 b 指向同一个对象时,计算结果为 true。

这不是真的boxedA === anotherBoxedA.

Kotlin - 平等

于 2017-12-04T08:38:52.823 回答
3

此代码示例旁边的文档对此进行了说明:

请注意,数字装箱不一定能保持身份

基本上,使用可空Int?类型会强制编译器对Integer生成的字节码中的那些变量使用装箱类型,而不是原始类型int。因此,代码示例转换为以下 Java 代码:

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

这当然会打印,因为这两个调用创建了false两个不同的实例。以为 JVM 对调用创建的实例有缓存,它只在 -128 和 127 之间工作——如果你运行代码时具有该范围内的值,那么两个比较确实都会返回。IntegerInteger.valueOfInteger.valueOfatrue

于 2017-12-04T08:45:43.413 回答
1

引用相等意味着两个引用指向同一个对象。

Document,引用相等性由 === 操作(及其否定的对应物!==)检查。a === b 当且仅当 a 和 b 指向同一个对象时才计算为 true。

于 2017-12-04T08:44:34.413 回答
0

在 kotlin 中,我们有两个不同的相等概念,引用相等结构相等

参照平等

我们使用===符号,它允许我们评估对象的引用(如果它指向同一个对象)。这相当于java中的“==”运算符。这就是为什么boxedA === anotherBoxedA返回 false(因为它们是两个独立的对象,每个都指向内存中的不同位置)。

结构平等

我们使用==符号来评估两个值是否相同(或相等)。这通常是通过equals()在java中实现方法来实现的。这就是boxedA == anotherBoxedA它返回 true的原因

于 2017-12-04T08:49:00.153 回答