2017-07-17 252 views
2

请帮助我理解这一段代码在科特林文档: -科特林盒装诠释也不尽相同

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 

请,如果我理解了错误的方式,有人指导,检查正确的地方或解释有点对我来说。

+1

虽然我不是100%肯定,我认为'Int'是一样的Java类'int'(基本),而''诠释是一样的'整数'(对象) – danielspaniol

+2

为什么倒票?用户明确表示,如果他/她认识错误,应引导他/她。我显然没有看到这个问题应该被投票的原因。 –

+0

@danielspaniol也许我会让你失望[这里](https://stackoverflow.com/a/45144516/7607923),:) –

回答

-1

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

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

val copyOfA: Int = a 

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

val copyOfA = a 

作为用于比较:

==被用于通过在值比较科特林(这是使用相当于in Java),===用于比较参考(这是Java中的==)。

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

你可以看到官方文档here的相关部分。

1

它检查它是否为空使用int?

这不是这个意思。

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

检查here

val anotherBoxedA: Int? = a 

这意味着anotherBoxedA可以分配空值或是可空

val anotherBoxedA: Int? = null 

这将被允许。

1

首先,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?是相同的行为的Java拳的intInteger,例如:

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