在Kotlin中,如果我们将类成员声明为 var 和 nullable 类型,则编译器不允许我们运行成员函数,尽管我们在调用函数之前放置了if语句,因为编译器无法保证该成员在针对null进行检查之后并在调用该方法之前,未将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字节码,则可以清楚地看到它。
关于if-statement - 是什么使安全调用(问号)与经典的解释不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64339679/