Kotlin 匿名对象中如何用带标签的this替代临时变量引用自身实例
解决方案
你只需要给匿名BImpl对象的表达式手动添加自定义标签,就可以通过带标签的this直接引用该实例,无需额外定义临时变量t,修改后的代码如下:
class AImpl : A { override fun createB(): B { // 给返回的匿名BImpl对象加自定义标签@BImplInstance return@BImplInstance object : BImpl { override fun createC(): C { return CBuilderInstance.buildC { // this: CBuilder // 直接通过自定义标签引用外层匿名BImpl实例 this.B = this@BImplInstance } } } } } class CBuilder { fun buildC(block: CBuilder.() -> Unit): C { // ... } }
原理解释
Kotlin 中只有带显式标签的代码块/表达式才能通过this@标签名的形式引用对应作用域的实例。匿名对象表达式默认不会生成内置的可引用标签,因此IDE默认只会提示当前作用域的this(指向CBuilder实例)和外层类的this@AImpl,不会主动识别匿名BImpl实例的作用域。手动给匿名对象的返回表达式添加自定义标签后,就可以正常引用对应实例了。
内容的提问来源于stack exchange,提问作者Taskeren
相关产品推荐
相关产品推荐

