盒装Int的Kotlin不一样

kot*_*elp 5 autoboxing boxing nullable kotlin

请帮助我理解kotlin文档中的这段代码: -

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
Run Code Online (Sandbox Code Playgroud)

现在,我明白,int a = 10000在下一行中它首先使用它进行比较===.

现在问题是为什么当它被分配时boxedA=a,它检查它是否为空使用int?.可以这样写: -

val boxedA: Int=a
Run Code Online (Sandbox Code Playgroud)

如果我以错误的方式理解它,有人指导检查正确的地方或为我解释一下.

hol*_*ava 6

首先,Int将根据其上下文映射到java int/ Integer.如果Int是泛型参数,则其映射类型为Integer.否则,它是原始类型int.例如:

val a:Int = 1 
//final int a = 1; //mapped to java code

val numbers:List<Int> = asList(1,2,3)
//final List<Integer> numbers  = asList(1, 2, 3); //mapped to java code
Run Code Online (Sandbox Code Playgroud)

其次,拳击的Int一个Int?是相同的行为的Java拳的int一种Integer,例如:

val a:Int = 1   // int a = 1;
val b:Int? = a; // Integer b = a;
Run Code Online (Sandbox Code Playgroud)

为什么盒装整数不一样?

这是因为Integer缓存范围内的值[-128, 127].a上面的变量超出了缓存范围,它将为每个装箱创建一个新的Integer实例,而不是使用缓存值.例如:

//                v--- 1 is in cache range 
val ranged: Int = 1
val boxedRanged1: Int? = ranged
val boxedRanged2: Int? = ranged

println(boxedRanged1 === boxedRanged2) //true
Run Code Online (Sandbox Code Playgroud)
//                   v--- 128 is out of cache range
val excluded: Int = 128
val boxedExcluded1: Int? = excluded
val boxedExcluded2: Int? = excluded

println(boxedExcluded1 === boxedExcluded2) //false
Run Code Online (Sandbox Code Playgroud)


zsm*_*b13 1

当它分配时boxedA = a,它使用检查它是否为空int?

我不知道你这是什么意思。使变量具有类型使其成为可以存储或 的Int?变量。此作业中没有进行任何检查。如果您有一个非空值要分配给变量,只需将其设置为不可为空,而无需在类型中添加:Intnull?

val copyOfA: Int = a
Run Code Online (Sandbox Code Playgroud)

您甚至可以省略类型,并进行Int推断:

val copyOfA = a
Run Code Online (Sandbox Code Playgroud)

至于比较:

==在 Kotlin 中用于按值比较(这相当于equalsJava 中的 using),===用于比较引用(这==在 Java 中)。

当您创建boxedA和时anotherBoxedA,您Integer在底层创建了两个实例(因为可为 null 的变量不能用基元表示)。与 比较时,它们相等==(它们具有相同的值),但与 比较时则不同===(它们是不同的实例)。

您可以在这里查看官方文档的相关部分。