为什么可以为空的数字不保留身份

时间:2017-12-04 08:35:02

标签: android kotlin kotlin-android-extensions kotlin-extension

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 个答案:

答案 0 :(得分:3)

  当且仅当a和b指向相同时,

a === b才会计算为真   对象

对于boxedA === anotherBoxedA.

,情况并非如此

Kotlin - Equality

答案 1 :(得分:2)

此代码示例旁边的the documentation中对此进行了解释:

  

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

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

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

这当然打印false,因为两个Integer调用创建了两个不同的Integer.valueOf个实例。认为JVM已缓存Integer.valueOf调用it only works between -128 and 127创建的实例 - 如果您运行的代码a具有该范围内的值,则两个比较都将返回{{1} }。

答案 2 :(得分:0)

  

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

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

答案 3 :(得分:0)

在kotlin中,我们有两个不同的平等概念,参考平等结构平等

参考平等

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

结构平等

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