是什么让安全调用(问号)与经典 if 的解释不同?
What makes safe call (question mark) to be interpreted differently from classic if?
在 Kotlin 中,如果我们将 class 成员声明为 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字节码就可以清楚的看到
在 Kotlin 中,如果我们将 class 成员声明为 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字节码就可以清楚的看到