我有点kotlin新手,我正在尝试删除回调本身内部的回调实例。
我正在努力实现的目标类似于以下代码。
private val myCallback = SomeInterfaceType {
if(it.something) {
someObject.removeListener(this@SomeInterfaceType)
}
}
当然它不会编译,否则我不会在这里问。所以我问,如何从界面实例中删除回调?
修改 错误是“推断类型是X但是Y是预期的。
编辑2:我刚刚意识到我提出了错误的问题,它与它类似但不完全是一个界面。
我正在使用的对象具有以下构造函数/接口
public open class Watcher<T> public constructor(call: (T) -> kotlin.Unit)
所以实际上我试图从call: (T) -> kotlin.Unit
内部引用Watcher来删除监听器。
这可能吗?
答案 0 :(得分:8)
您需要使用完整的object expression语法来引用能够引用实例本身:
private val myCallback = object: SomeInterfaceType() {
override fun onSomeEvent() {
if (it.something) {
someObject.removeListener(this)
}
}
}
答案 1 :(得分:2)
还有一个解决方法:将对myCallback
的引用包装到传递给调用它的函数的lambda中(例如run { ... }
):
private val myCallback: SomeInterfaceType = SomeInterfaceType {
if (it.something) {
someObject.removeListener(run { myCallback })
}
}