请帮助我理解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
如果我以错误的方式理解它,请有人指导检查正确的地方或为我解释一下。
答案 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的相关部分。