2016-03-26 14 views
1

Bir BroadcastReceiver alt sınıfını oluşturuyorum ve bir lambdayı girdi parametresi olarak belirtmek ve doğrudan "onReceive" için kullanılacak şekilde kullanmak üzere atamak istiyorum.Lambda'yı doğrudan devralınan soyut yönteme atama [Kotlin]

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

    fun itWorks(context: Context?, intent: Intent?) = callback 
} 

Sevdiğim örneğini edebilmek istiyorum: Bu benim kod benziyor nasıl

val myReceiver = Receiver({context: Context?, intent: Intent?-> { 
    println("Intent received: $intent") 
}}) 

Ya

aşağıdaki hatayı alıyorum Ancak
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'

İlginç bir şekilde, ben bir Bu lambda'yı "itWorks" yöntemine atarken hata alamıyorum. Lütfen bu iki yöntem arasındaki farkın ne olduğunu söyleyebilir misiniz? Neden biri ile çalışıyor, diğeriyle değil? Her iki yöntemde de imzaların aynı olduğunu söyleyebilirim.

çalıştığını Tabii

(I (kadarıyla lambda'lar gitmek gibi) umursadığın hepsi aynı yöntem imzaya sahip olan bir Java8 arka plan, geliyorum), ama başka bir şekilde tercih ediyorum :

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

Bu yöntemin dönüş türü haline sırf çalışır:

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

cevap

4

Sen parametreleri ile lambda callback çağırmak gerekir (Yöntem parametreleri kullanılmayan olmak üzere) s (Context?, Intent?) -> Unit: Tamamen aslında lambda kendisi çağırmak unuttum

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

vay. Çok teşekkürler, şimdi hatasız çalışıyor! Ayrıca, "itWorks" yöntemi bir hata vermedi, çünkü yöntemin dönüş türü örtüktü ve lambda'nın türü oldu. Şimdi anladım. – pjozsef