1

Kotlin中,如果我们将一个类成员声明为var和可为的类型,编译器不允许我们运行该成员函数,尽管我们在调用该函数之前放置了一个 if 语句,因为编译器不能保证该成员不是在检查 null 之后和调用方法之前设置为 null。 但是如果我们使用安全调用编译器会批准我们的代码。我的问题,编译器如何使安全调用原子化?不是第二个线程可以在检查 null 和调用方法(示例中的吃方法)之间更改变量吗?第一种情况的代码:

        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
    }
}
4

1 回答 1

3

编译器将字段的内容放入局部变量,然后将其与 null 进行比较。如果你反编译 Kotlin 字节码,你可以清楚地看到它。

于 2020-10-13T16:55:29.237 回答