我正在为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)
}
}
答案 0 :(得分:4)
您需要使用参数调用lambda constexpr
:
callback
这只是因为方法的返回类型变为 override fun onReceive(context: Context?, intent: Intent?) = callback(context, intent) // returns Unit
(方法参数未被使用):
(Context?, Intent?) -> Unit