在Kotlin中移除“this”回调

7

我是一个 Kotlin 新手,正在尝试在回调函数内部删除回调实例。

我的目标类似于以下代码。

private val myCallback = SomeInterfaceType {
   if(it.something) {
        someObject.removeListener(this@SomeInterfaceType)
   }
}

当然,如果它可以编译,我就不会在这里发问了。所以我想问,如何从接口实例中删除回调函数?
编辑:错误是“推断类型为X,但期望类型为Y”。
编辑2:我刚意识到我问错了问题,与接口类似但并不是完全一样。
我使用的对象具有以下构造器/接口: public open class Watcher public constructor(call: (T) -> kotlin.Unit)
因此,实际上我试图从call: (T) -> kotlin.Unit中引用Watcher,以删除监听器。
这是否可能?

2
当然它无法编译。那么你得到的完整、精确的错误信息是什么? - Michael
someObject.removeListener(this)。请查看zsmb13的答案。 - IntelliJ Amiya
2个回答

14
您需要使用完整的对象表达式语法才能引用实例本身:object expression
private val myCallback = object: SomeInterfaceType() {
    override fun onSomeEvent() {
        if (it.something) {
            someObject.removeListener(this)
        }
    }
}

非常感谢您的回答,就我在这里的测试而言,那确实是 interface 的正确答案。请检查我对问题的编辑,我后来才意识到我实际上正在使用 code: (T) -> kotlin.Unit。这是否可能? - Budius

2

还有一个解决办法:将对 myCallback 的引用包装成一个 lambda,通过一个调用它的函数传递(例如,run { ... }):

private val myCallback: SomeInterfaceType = SomeInterfaceType {
   if (it.something) {
        someObject.removeListener(run { myCallback })
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接