如果我有一个可空类型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?"
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先检查null是允许的,为什么?
val something: Xyz? = createPossiblyNullXyz()
if (something != null) {
something.foo()
}
Run Code Online (Sandbox Code Playgroud)
假设我确定它确实从未如此,如何null
在不需要if
检查的情况下更改或处理值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 …
Run Code Online (Sandbox Code Playgroud) 如果我想检查一个可为空的,Boolean
我会得到一个type mismatch
var bool: Boolean? = true
if(bool)
println("foo")
else
println("bar")
Run Code Online (Sandbox Code Playgroud)
因为Boolean is expected
不是Boolean?
这可能只是Use of Boolean? 在 if 表达式中,但我对 Kotlin 了解不够,无法知道它是否是...
我想测试是否body : String?
包含expected : String
作为子字符串。(如果body
是null
,那么它不包含子字符串。)我发现我可以这样写我的条件:
if (body?.contains(expected) == true) {
succeed()
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
if (body?.contains(expected) != true) {
fail()
}
Run Code Online (Sandbox Code Playgroud)
(body?.contains(expected)
type 的表达式在哪里Boolean?
),但这真的是编写这种条件的最佳或最惯用的方式吗?是否有任何替代方案(可能使用 的其他成员函数String
)对眼睛更容易?