如何解决是什么使安全呼叫问号与经典的解释不同?
在 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字节码,则可以清楚地看到它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。