【发布时间】:2020-11-26 13:57:48
【问题描述】:
我目前正在开发一些旧的 Java 编写的 Android 项目,但在 Kotlin 中编写我不太熟悉的新部分。我需要一些方法来解开可空对象(类似于 Swift 中的 if let unwrappedMyVar = myVar else {}),为此我使用 myVar?.let {} 范围函数,它解开 myWar 并在它不为空的情况下执行块。但是现在我真的很好奇这些作用域函数是如何在 Kotlin 中实现的,实际上是编译成 Java 匿名类的吗?如果是这样,那么它可能会导致与 Java 匿名类相同的问题。并且很容易造成泄漏
谢谢!
亲切的问候,
Andre
【问题讨论】:
-
他们不是,你所说的对象在生成的字节码上不存在。该函数只是在调用站点被复制,有效地减少了所有的性能开销。阅读更多关于他们的信息Inline Functions
-
顺便说一句,在 Kotlin 中,您不会在这种情况下谈论“解包”变量。只是在
let()内,编译器知道该值不能为null。 (它在类型中表达了这一点:如果原始值是可空的String?,则结果将是不可空的String。) 这称为smart-casting。