将lambda直接赋值给继承的抽象方法[Kotlin]

时间:2016-03-26 18:09:46

标签: android kotlin

我正在为BroadcastReceiver创建子类,并且希望能够将lambda指定为输入参数,并直接指定它作为“onReceive”的实现。这就是我的代码的样子:

class Receiver(val callback: (Context?, Intent?) -> Unit): BroadcastReceiver(){
    override fun onReceive(context: Context?, intent: Intent?) = callback

    fun itWorks(context: Context?, intent: Intent?) = callback
}

我希望能够实例化它:

val myReceiver = Receiver({context: Context?, intent: Intent?-> {
    println("Intent received: $intent")
}})

或者

val myReceiver2 = Receiver(::implementationHere)

但是我收到以下错误:

  

错误:(2,18)'onReceive'的返回类型不是被覆盖成员'public abstract fun onReceive的返回类型的子类型(p0:android.content.Context!,p1:android.content.Intent !):在android.content.BroadcastReceiver'

中定义的kotlin.Unit

有趣的是,在将此lambda分配给“itWorks”方法时,我没有收到错误。你能告诉我这两种方法有什么区别吗?为什么它适用于一个而不是另一个?据我所知,这两种方法的签名都是一样的。

(我来自Java8背景,其中(就lambda而言)你所关心的只是拥有相同的方法签名)

当然这有效,但我更喜欢另一种方式:

class Receiver2(val callback: (Context?, Intent?) -> Unit): BroadcastReceiver(){
    override fun onReceive(context: Context?, intent: Intent?) {
        callback(context, intent)
    }
}

1 个答案:

答案 0 :(得分:4)

您需要使用参数调用lambda constexpr

callback

这只是因为方法的返回类型变为 override fun onReceive(context: Context?, intent: Intent?) = callback(context, intent) // returns Unit (方法参数未被使用):

(Context?, Intent?) -> Unit