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中的任何类型?_Kotlin_Types_Null - Fatal编程技术网

为什么我能';是否将可空类型分配给Kotlin中的任何类型?

为什么我能';是否将可空类型分配给Kotlin中的任何类型?,kotlin,types,null,Kotlin,Types,Null,有人能解释一下为什么在科特林这样做是不可能的吗 val x :Int? = 123 val y :Any = x 我来自.NET背景,其中可空类型可分配给对象类型,但它们有何区别?与文档: Kotlin的类型系统旨在消除代码(也称为 在Kotlin中,类型系统区分可以保存null的引用(可空引用)和不能保存null的引用(非null引用) 例如: var a: String = "abc" a = null // compilation error var b: Stri

有人能解释一下为什么在科特林这样做是不可能的吗

val x :Int? = 123
val y :Any = x
我来自.NET背景,其中可空类型可分配给对象类型,但它们有何区别?

与文档:

Kotlin的类型系统旨在消除代码(也称为

在Kotlin中,类型系统区分可以保存null的引用(可空引用)和不能保存null的引用(非null引用)

例如:

var a: String = "abc"
a = null // compilation error

var b: String? = "abc" //using `String?` allows you to assign null
b = null // ok
print(b)

是一个与相同的类,唯一的区别是每个类都有
Any
作为它的超类。但是我写的关于NPE的上述内容适用于kotlin中的所有类型。

第一行代码
valx:Int?=123
明确表示x应该包含类型为
Int的值
Kotlin提供用于表示数字的内置类型
Int

在下一行,
val y:Any=x
,y应该包含一种类型的
Any
,它是Kotlin类层次结构的根。每个Kotlin类都有
Any
作为超类


因此存在类型不匹配-因此Kotlin编译器抱怨它无法将
Int
分配给您声明为持有类型
Any
Yes的对象。Kotlin变量的基本要求是标记它是否可为null,以避免NPE

在你的情况下

var x: Int? = 123
是否指定为可为空的值?但是,当您将其映射到任何对象时,是否错过了添加nullable?对任何物体

所以
vary:Any?=x


正如我们将可空类型标记为y一样。

可空类型不是
Any
的子类型,而是
Any?
的子类型

Any
只是不可为空类型的超类。这使得编写需要任何非空实例的代码成为可能,并且仍然受益于类型检查器的安全性(与使用Java的
对象时不同)

以下是一幅有帮助的图片:

以下代码是您的有效替代代码:

val x: Int? = 123
val y: Any? = x

“每个Kotlin类都有一个作为超类的Any。”这包括
Int
。因此,您可以将
Int
分配给
Any
而不会出现问题,只是不能分配
Int?