android - Assign lambda directly to inherited abstract method [Kotlin] -


i subclassing broadcastreceiver , able specify lambda input parameter , assign directly used implementation "onreceive". how code looks like:

class receiver(val callback: (context?, intent?) -> unit): broadcastreceiver(){     override fun onreceive(context: context?, intent: intent?) = callback      fun itworks(context: context?, intent: intent?) = callback } 

i able instantiate like:

val myreceiver = receiver({context: context?, intent: intent?-> {     println("intent received: $intent") }}) 

or

val myreceiver2 = receiver(::implementationhere) 

however following error:

error:(2, 18) return type of 'onreceive' not subtype of return type of overridden member 'public abstract fun onreceive(p0: android.content.context!, p1: android.content.intent!): kotlin.unit defined in android.content.broadcastreceiver'

interestingly, not getting error when assigning lambda "itworks" method. please tell me what's difference between these 2 methods? why work 1 not other? far can tell signatures same in both methods.

(i'm coming java8 background, (as far lambdas go) care have same method signature)

of course works, prefer other way:

class receiver2(val callback: (context?, intent?) -> unit): broadcastreceiver(){     override fun onreceive(context: context?, intent: intent?) {         callback(context, intent)     } } 

you need invoke lambda callback parameters:

    override fun onreceive(context: context?, intent: intent?) = callback(context, intent) // returns unit 

this works because method's return type becomes (context?, intent?) -> unit (with method parameters being unused):

    fun itworks(context: context?, intent: intent?) = callback // returns (context?, intent?) → unit 

Comments