将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
- 从Android Studio运行时,Kotlin Kapt不显示数据绑定错误
- 什么是KTX(Kotlin扩展库),为什么它在Android开发中越来越受欢迎
- 如何获取Android Studio中的用户输入数值并将其转换为kotlin中的variablesint?
- lateinit属性主持人还没有被EasyMVP,Robolectric和Kotlin初始化
- 使用RxAndroid处理onKeyDown
- Firebase连接在Kotlin上创建用户错误
- 任何机会让CodeMirror在Android Chrome上玩?
- 如何在RxJava 2和Android中延迟onError()?
- 带有产品风味和Kotlin的ClassNotFoundException