最佳答案
如果我有一个可空类型Xyz?
,我想引用它或将它转换为非可空类型Xyz
。在Kotlin中这样做的惯用方法是什么?
例如,以下代码是错误的:
val something: Xyz? = createPossiblyNullXyz()
something.foo() // Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Xyz?"
但如果我先检查空,它是允许的,为什么?
val something: Xyz? = createPossiblyNullXyz()
if (something != null) {
something.foo()
}
我如何在不需要if
检查的情况下改变或处理一个不是null
的值,假设我确定它真的从来没有null
?例如,这里我正在从一个映射中检索一个值,我可以保证它存在,而get()
的结果不是null
。但我有一个错误:
val map = mapOf("a" to 65,"b" to 66,"c" to 67)
val something = map.get("a")
something.toLong() // Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Int?"
方法get()
认为该项可能缺失,并返回类型Int?
。因此,将值的类型强制为非空的最佳方法是什么?
注意: 这个问题是作者有意写下并回答的(自我回答的问题),所以通常被问到的Kotlin主题的惯用答案出现在so中。同时也要澄清一些为Kotlin alpha编写的旧答案,这些答案对于现在的Kotlin来说并不准确。