【问题标题】:Remove "this" callback in kotlin删除 kotlin 中的“this”回调
【发布时间】:2019-03-01 19:30:49
【问题描述】:

我有点 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) -&gt; kotlin.Unit 内部引用 Watcher 以删除侦听器。

这可能吗?

【问题讨论】:

  • “当然它不能编译” 那么您收到的完整、准确错误消息是什么?
  • someObject.removeListener(this) 。检查zsmb13的答案

标签: android kotlin


【解决方案1】:

您需要使用完整的object expression 语法来引用才能引用实例本身:

private val myCallback = object: SomeInterfaceType() {
    override fun onSomeEvent() {
        if (it.something) {
            someObject.removeListener(this)
        }
    }
}

【讨论】:

  • 非常感谢您的回答,据我在这里测试,这确实是interface 的正确答案。请检查我对该问题的编辑,我后来才意识到它实际上是我正在使用的code: (T) -&gt; kotlin.Unit。这可能吗?
【解决方案2】:

还有一个解决方法:将对 myCallback 的引用包装到传递给调用它的函数的 lambda 中(例如 run { ... }):

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

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2019-06-03
    • 2012-12-14
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多