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?
使它成为一个变量,可以存储一个Int
或null
。 这项任务没有检查。 如果你有一个非空值分配给变量,只是使其不可空,没有?
在类型中:
val copyOfA: Int = a
你甚至可以省略类型,并得到Int
推断:
val copyOfA = a
至于比较:
==
用于在Kotlin中进行比较(这equals
在Java中使用equals
), ===
用于比较引用(在Java中为==
)。
当你创建boxedA
和anotherBoxedA
,你在引擎盖下创建了两个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
其次,拳击Int
到Int?
是相同的行为,像一个Integer
的int
拳击,例如:
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