盒装Int的Kotlin不一样

时间:2017-07-17 08:30:50

标签: kotlin nullable boxing autoboxing

请帮助我理解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

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

3 个答案:

答案 0 :(得分:5)

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

其次,将Int装箱Int?与将int装入Integer的行为相同,例如:

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

为什么盒装整数不一样?

这是因为在[-128, 127]范围内仅Integer 缓存值。上面的变量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

答案 1 :(得分:1)

  

使用int检查它是否为null?

这不是它的意思。

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

检查here

val anotherBoxedA: Int? = a

这意味着anotherBoxedA可以指定为null或可以为空

val anotherBoxedA: Int? = null

这是允许的。

答案 2 :(得分:-1)

  

分配f char时,它使用Enter s char s Enter g char g Enter f char 15 ==> why this number ? s Enter f char time almost finish: 5 Enter f char ('\ntime finish', 10, ' second')

检查它是否为空

我不知道你的意思。使变量具有boxedA = a类型使其成为可以存储int?Int?的变量。这项任务没有检查。如果您有一个非空值要分配给变量,只需将其设为不可为空,而不使用类型中的Int

null

您甚至可以省略该类型,并获得?推断:

val copyOfA: Int = a

至于比较:

Int用于按Kotlin中的值进行比较(这相当于在Java中使用val copyOfA = a ),==用于比较引用(这是equals在Java)。

当您创建=====时,您会在底层创建两个boxedA实例(因为可以为空的变量无法用可原生的变量表示)。与anotherBoxedA(它们具有相同的值)相比,这些值相等,但与Integer(它们是不同的实例)相比时则不相同。

您可以查看官方文档here的相关部分。