Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin-boxed-Int不相同_Kotlin_Nullable_Boxing_Autoboxing - Fatal编程技术网

Kotlin-boxed-Int不相同

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?检

请帮助我理解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?
检查它是否为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
将映射到java
Int
/
整数。如果
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
与Javas
Int
(一个原语)相同,而
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中由强制执行。