在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/

10-10 19:39