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
Post a Comment