Kotlin盒装诠释是不一样的

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

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

现在,我明白了,首先int a = 10000然后在下一行它是使用===进行比较。

现在的问题是,为什么当它分配boxedA=a ,它检查是否为空使用int? 。 它可以写成这样: –

 val boxedA: Int=a 

如果我的理解错误,请有人指导检查一下正确的地方,或者给我解释一下。

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

我不知道你的意思。 制作一个变量的类型是Int? 使它成为一个变量,可以存储一个Intnull 。 这项任务没有检查。 如果你有一个非空值分配给变量,只是使其不可空,没有? 在类型中:

 val copyOfA: Int = a 

你甚至可以省略类型,并得到Int推断:

 val copyOfA = a 

至于比较:

==用于在Kotlin中进行比较(这equals在Java中使用equals ), ===用于比较引用(在Java中为== )。

当你创建boxedAanotherBoxedA ,你在引擎盖下创建了两个Integer实例(因为可空变量不能由基元表示)。 与== (它们具有相同的值)相比,这些将是相等的,但与=== (它们是不同的实例)相比不会。

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

它检查是否为空使用int?

这不是什么意思。

Kotlin的默认安全功能不允许将变量设置为null。

在这里检查。

 val anotherBoxedA: Int? = a 

这意味着anotherBoxedA可以被赋值为null或者可以为

 val anotherBoxedA: Int? = null 

这将被允许。

首先, 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 

其次,拳击IntInt? 是相同的行为,像一个Integerint拳击,例如:

 val a:Int = 1 // int a = 1; val b:Int? = a; // Integer b = a; 

为什么盒装整数是不一样的?

这是因为整数只缓存范围[-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 

 // v--- 128 is out of cache range val excluded: Int = 128 val boxedExcluded1: Int? = excluded val boxedExcluded2: Int? = excluded println(boxedExcluded1 === boxedExcluded2) //false