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)
如果我以错误的方式理解它,有人指导检查正确的地方或为我解释一下.
首先,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)
当它分配时
boxedA = a
,它使用检查它是否为空int?
我不知道你这是什么意思。使变量具有类型使其成为可以存储或 的Int?
变量。此作业中没有进行任何检查。如果您有一个非空值要分配给变量,只需将其设置为不可为空,而无需在类型中添加:Int
null
?
val copyOfA: Int = a
Run Code Online (Sandbox Code Playgroud)
您甚至可以省略类型,并进行Int
推断:
val copyOfA = a
Run Code Online (Sandbox Code Playgroud)
至于比较:
==
在 Kotlin 中用于按值比较(这相当于equals
Java 中的 using),===
用于比较引用(这==
在 Java 中)。
当您创建boxedA
和时anotherBoxedA
,您Integer
在底层创建了两个实例(因为可为 null 的变量不能用基元表示)。与 比较时,它们相等==
(它们具有相同的值),但与 比较时则不同===
(它们是不同的实例)。
您可以在这里查看官方文档的相关部分。