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()
}