問題

想要在一個可以接受暫停lambda並執行它的開放類中有一個函式.

當您明確指定型別時,我知道這是有效的,但如果可能需要它接受通用範圍的lambdas.

 class ChildClass : SuperClass() {

    // does work :)
    fun launch(block: suspend ChildClass.() -> Unit) =
        coroutineThing { this.block() }

}
 
 open class SuperClass {

    // doesn't work :(
    fun <T : SuperClass> launch(block: suspend T.() -> Unit) = 
        coroutineThing { this.block() }

}
 

我得到的錯誤是Expression 'block' of type 'suspend T.() -> Unit' cannot be invoked as a function. The function 'invoke()' is not found.

編輯:

尋找最終從ChildClass的例項呼叫此方法,如下所示:ChildClass().launch { doStuff() }

  最佳答案

你可以這樣寫,但我不知道它是如何工作的:)對我來說,它看起來像Kotlin問題.

 open class SuperClass {
    fun <T : SuperClass> launch(block: suspend T.() -> Unit) =
        coroutineThing { block.invoke(this as T) }
}
 

但在這種情況下,您必須像這樣呼叫它:

 ChildClass().launch<ChildClass> { println("test") }
 

但是你可以改變它,像你想要的那樣呼叫它:

 open class SuperClass<T : SuperClass<T>> {
    fun launch(block: suspend T.() -> Unit) =
        coroutineThing { block.invoke(this as T) }
}

class ChildClass : SuperClass<ChildClass>()

//invokation
ChildClass().launch { println("test") }
 

  相同標籤的其他問題

kotlinkotlin-coroutines