2016-03-26 4 views
1

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) 
    } 
} 

Antwort

4

Sie benötigen eine Lambda-callback mit Parametern aufzurufen: nur weil die Methode der Rückgabetyp werden

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

Dies funktioniert s (Context?, Intent?) -> Unit (mit den Verfahrensparametern ist, nicht verwendet):

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

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

Verwandte Themen