Ich untergliedere einen BroadcastReceiver und möchte einen Lambda als Eingabeparameter angeben und ihn direkt der Implementierung für "onReceive" zuweisen. Dies ist, wie mein Code wie folgt aussieht:Zuordnung von Lambda zu geerbter abstrakter Methode [Kotlin]
class Receiver(val callback: (Context?, Intent?) -> Unit): BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) = callback
fun itWorks(context: Context?, intent: Intent?) = callback
}
ich es in der Lage sein möchte instanziiert mag:
val myReceiver = Receiver({context: Context?, intent: Intent?-> {
println("Intent received: $intent")
}})
Oder
val myReceiver2 = Receiver(::implementationHere)
Jedoch habe ich die folgende Fehlermeldung erhalten:
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'
Interessanterweise bin ich ein Es wird kein Fehler angezeigt, wenn dieses Lambda der "itWorks" -Methode zugewiesen wird. Können Sie mir bitte sagen, was ist der Unterschied zwischen diesen beiden Methoden? Warum funktioniert es mit einem, aber nicht mit dem anderen? Soweit ich das beurteilen kann, sind die Signaturen in beiden Methoden gleich.
(Ich bin von einem Java8 Hintergrund kommen, wo (soweit lambdas gehen) alles, was Sie über Pflege ist die gleiche Methode Signatur haben)
Natürlich funktioniert das, aber ich würde in die andere Richtung bevorzugen :
class Receiver2(val callback: (Context?, Intent?) -> Unit): BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
callback(context, intent)
}
}
Wow, I ganz vergessen, um tatsächlich die Lambda selbst aufrufen. Vielen Dank, es funktioniert jetzt ohne Fehler! Die Methode "itWorks" verursachte auch keinen Fehler, da der Rückgabetyp der Methode implizit war und zum Typ des Lambda wurde. Jetzt verstehe ich. – pjozsef