Kotlin-boxed-Int不相同
请帮助我理解kotlin文档中的这段代码:-Kotlin-boxed-Int不相同,kotlin,nullable,boxing,autoboxing,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'!!! 现在,我了解到,首先inta=10000,然后在下一行中,它使用=进行比较 现在的问题是,为什么在分配boxedA=a时,它会使用int?检
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
现在,我了解到,首先inta=10000
,然后在下一行中,它使用=
进行比较
现在的问题是,为什么在分配boxedA=a
时,它会使用int?
检查它是否为null。可以这样写吗-
val boxedA: Int=a
如果我理解错了,请有人指导我检查正确的地方或给我解释一下
它使用int检查它是否为null
这不是它的意思
Kotlin的空安全特性不允许在默认情况下将变量设置为空
检查
这意味着anotherBoxedA
可以赋值为null或可为null
这是允许的
当它分配boxedA=a
时,它使用int?
我不知道你这是什么意思。使变量具有类型Int?
使其成为可以存储Int
或null
的变量。此作业未进行任何检查。如果要为变量分配一个非null值,只需将其设置为非null值,类型中不包含?
:
val copyOfA: Int = a
您甚至可以省略该类型,并获得Int
推断值:
val copyOfA = a
至于比较:
=
用于按Kotlin中的值进行比较(这相当于在Java中使用equals
),==
用于比较引用(在Java中为=
)
当您创建boxedA
和anotherBoxedA
时,您将在引擎盖下创建两个Integer
实例(因为可空变量不能用原语表示)。当与==
比较时,它们将相等(它们具有相同的值),但当与==
比较时,它们不相等(它们是不同的实例)
您可以查看官方文档的相关部分。首先,根据上下文,
Int
将映射到javaInt
/整数。如果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
val a:Int = 1 // int a = 1;
val b:Int? = a; // Integer b = a;
// v--- 1 is in cache range
val ranged: Int = 1
val boxedRanged1: Int? = ranged
val boxedRanged2: Int? = ranged
println(boxedRanged1 === boxedRanged2) //true
为什么装箱整数不相同
这是因为只有缓存[-128127]
范围内的值。上面的变量a
超出缓存范围,它将为每个装箱创建一个新实例,而不是使用缓存的值。例如:
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
val a:Int = 1 // int a = 1;
val b:Int? = a; // Integer b = a;
// v--- 1 is in cache range
val ranged: Int = 1
val boxedRanged1: Int? = ranged
val boxedRanged2: Int? = ranged
println(boxedRanged1 === boxedRanged2) //true
虽然我不是100%确定,但我认为Int
与JavasInt
(一个原语)相同,而Int?
与Integer
(一个对象)相同。为什么投反对票?用户明确表示,如果他/她理解错误,应指导他/她。我显然不明白这个问题为什么会被否决。@danielspaniol也许我会让你失望,:)@holi java为什么会失望。它还声明Int
映射到Int
和Int?
映射到Integer
。或者你的意思是因为缓存范围?@danielspaniol,因为它们可能不一样。“如果Int是泛型参数,那么它的映射类型是Integer。”。我不这么认为,Integer在java中是可空的,而Int在Kotlin中是不可空的。如果希望泛型参数在kotlin中可以为null,则应将其声明为Int?@NullByte08 Hi,因为java不允许泛型的基元类型,因此实际的类型参数Int
由kotlin映射到java.lang.Integer
。可空/不可空是kotlin中的增强概念,而不是java。但是为什么val list:list=listOf(1,2,null)
无效呢?Int在Java中映射为整数,因此应该允许空值。你能解释一下你所说的“增强概念”是什么意思吗?或者你能指出一个来源吗?谢谢:)@NullByte08您好,我已经提到了,因为是kotlin特性,所以如果您愿意,您也可以声明Integer
/Integer?
。另一方面,从JVM的角度来看,每个引用类型都可以为Null,但在kotlin中由强制执行。