如何在Kotlin中引用“运行”或“应用”中的实现回调

时间:2019-04-11 13:16:27

标签: android kotlin

如何在“运行”或“应用”中包含实现参考

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.run {
            setCallback(this) // <-- How to have the MyCallback's reference here?
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}

2 个答案:

答案 0 :(得分:3)

由于run是在给run的块中带有接收者(kotlin reference)的lambda函数,this指的是接收者,即在您的示例myObject中。

因此,您需要使用qualified this表达式来引用封闭的MyClass实例。如评论中所述,您需要像这样更改代码:

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.run {
            setCallback(this@MyClass) // <-- qualified this
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}

如果要避免使用标签,则必须替换run函数。可能的替代方法是also,它不是将lambda与接收器一起使用,而是将对象作为参数:

class MyClass : MyCallback {

    ...
    fun myMethod() {
        val myObject = MyObject()
        myObject.also { obj ->
            //lambda without receiver, this refers to the enclosing instance of MyClass
            setCallback(this)
        }
    }

    override fun onMyCallback() {
        // Do something
    }
}

答案 1 :(得分:0)

recke96已经指出了解决该问题的两种方法,但这是另一种方法。只需在lambda之外给this命名即可。

class MyClass  {

    fun myMethod() {
        val myObject = MyObject()
        val callback = this // <--
        myObject.run {
            setCallback(callback)
        }
    }
    // ...
}

或者,使用let

class MyClass  {

    fun myMethod() {
        val myObject = MyObject()

        let { callback ->
            myObject.run {
                setCallback(callback)
            }
        }
    }
    // ...
}