我有一个从意图中提取数据的例子
val screen = intent.getParcelableExtra<Screen>("screen")
我收到的结果是一个不可为空的变量,但它可以为空,因为我不知道该包裹是否已添加到附加项目中。为什么Kotlin不返回可为空的类型?
答案 0 :(得分:2)
Kotlin只是调用getParcelableExtra()
,正如在Java的android SDK中定义的那样。此方法未使用@Nullable
进行注释,因此kotlin不知道它可能返回null。
可空性注释
具有可空性注释的Java类型 不是以平台类型表示,而是以实际可为空或 非null Kotlin类型。编译器支持以下几种 可空性注释,包括:
- JetBrains(来自org.jetbrains.annotations的@Nullable和@NotNull 包)
- Android(com.android.annotations和android.support.annotations)
答案 1 :(得分:0)
在代码中
val screen = intent.getParcelableExtra<Screen>("screen")
screen
的推断类型将为Screen!
。感叹号表示这是一个 platform类型,这意味着它可以为空或可以为空,但是编译器不会强制执行空检查行为。
了解更多:Null Safety and Platform Types
但是,如果您积极希望Kotlin强制执行null安全性,则可以明确指定类型:
val screen: Screen? = intent.getParcelableExtra<Screen>("screen")
通过显式指定类型,Kotlin将为您提供您习惯的所有编译时null安全性。