gpt4 book ai didi

android - 将 lambda 直接分配给继承的抽象方法 [Kotlin]

转载 作者:行者123 更新时间:2023-11-29 15:43:45 30 4
gpt4 key购买 nike

我正在对 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)

但是我得到以下错误:

Error:(2, 18) Return type of 'onReceive' is not a subtype of the return type of the overridden member 'public abstract fun onReceive(p0: android.content.Context!, p1: android.content.Intent!): kotlin.Unit defined in android.content.BroadcastReceiver'

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

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

当然这可行,但我更喜欢另一种方式:

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

最佳答案

您需要使用参数调用您的 lambda 回调:

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

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

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

关于android - 将 lambda 直接分配给继承的抽象方法 [Kotlin],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36238930/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com