问题描述
在 Kotlin 中,如果我们将类成员声明为 var 和 nullable 类型,则编译器不允许我们运行成员函数尽管我们在调用函数之前放置了if语句,因为在对null进行检查之后以及在调用方法之前,编译器无法保证不会将该成员设置为null。 但是,如果我们使用的是安全调用编译器会批准我们的代码。 我的问题是,编译器如何使安全调用原子化?第二个线程不是可以在检查null和调用方法(在示例中为eat方法)之间更改变量吗? 第一种情况的代码:
class MyWolf
{
var w : Wolf? = Wolf()
fun myFunction()
{
if (w != null)
{
w.eat()
}
}
}
class Wolf
{
fun eat() : Unit
println("wolf is eating")
}
第二种情况的代码:
class MyWolf
{
var w : Wolf? = Wolf()
fun myFunction()
{
w?.eat()
}
}
class Wolf
{
fun eat():Unit
{
//code
}
}
解决方法
编译器将字段的内容放入局部变量,然后将其与null进行比较。如果您反编译Kotlin字节码,则可以清楚地看到它。