Kotlin 如何处理非空的可空变量?
考虑这段代码:Kotlin 如何处理非空的可空变量?,kotlin,nullable,non-nullable,Kotlin,Nullable,Non Nullable,考虑这段代码: var foo: Foo? = null if (foo != null) { foo!!.bar() } 如果我忽略这两个!!我得到这个错误: 智能转换为“Foo”是不可能的,因为“Foo”是一个可变属性,此时可能已经更改 这是关于并发性的,对吗?嗯,没有可能更改foo值的并发代码 当然,它和这两个一起工作!!。然而,我想知道这是最惯用的方法还是有更好的方法,没有这两种方法 我知道在这种情况下我可以foo?.bar()。但问题是,在我检查了foo是否为null之后,
var foo: Foo? = null
if (foo != null) {
foo!!.bar()
}
如果我忽略这两个!!我得到这个错误:
智能转换为“Foo”是不可能的,因为“Foo”是一个可变属性,此时可能已经更改
这是关于并发性的,对吗?嗯,没有可能更改foo
值的并发代码
当然,它和这两个一起工作!!。然而,我想知道这是最惯用的方法还是有更好的方法,没有这两种方法
我知道在这种情况下我可以
foo?.bar()
。但问题是,在我检查了foo是否为null之后,我是否可以将foo
视为foo
而不是foo?
好吧,如果foo
是一个局部变量,那么这段代码就可以工作。我猜,您的代码看起来有点不同,foo
是类的一个字段。解决方案很简单:使用:
让
“捕获”变量的值,以便对原始变量的任何修改都不会影响传递的lambda。这里使用safe call来调用let
,仅对非空值进行调用。实际上,您的选项是将其分配给函数范围内的val
,或者使用范围函数之一(let
,run
,apply
,也
)我如何将其分配给函数范围内的val,所以val的类型是Foo(不是Foo?)“这是关于并发的,对吗?没有并发代码可能会改变Foo
”的值。您可能知道没有并发,但编译器无法保证。@user1785730,val
将是Foo?
类型。不过,现在smart cast可以工作了,您不需要代码>在代码中。
foo?.let {
it.bar()
}