将lambda直接分配给inheritance的抽象方法

我是一个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”的返回types不是被重写的成员的公共抽象types的子typesonReceive(p0:android.content.Context!,p1:android.content.Intent!): kotlin.Unit在android.content.BroadcastReceiver中定义’

有趣的是,当将这个lambda分配给“itWorks”方法时,我没有收到错误。 你能告诉我这两种方法有什么区别吗? 为什么它与一个而不是另一个协同工作? 据我所知,这两种方法的签名是相同的。

(我来自Java8的背景,在哪里(就lambdaexpression式而言)你所关心的只是具有相同的方法签名)

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

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

你需要用参数调用你的lambda callback函数:

  override fun onReceive(context: Context?, intent: Intent?) = callback(context, intent) // returns Unit 

这只是因为方法的返回types变成(Context?, Intent?) -> Unit (方法参数未被使用):

  fun itWorks(context: Context?, intent: Intent?) = callback // returns (Context?, Intent?) → Unit