是什么使安全呼叫问号与经典的解释不同?

问题描述

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字节码,则可以清楚地看到它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...