为什么我能';是否将可空类型分配给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?
。