Expresiones Lambda en Kotlin

Considere la siguiente class de Java:

public class SomeClass { public interface Something { void doSomething(); } public void call(Something something) {} } 

En Kotlin, puedo usar una expresión lambda de la siguiente manera:

 SomeClass().call { // do something } 

Pero si defino el siguiente método en Kotlin (usando la misma interfaz):

 fun call(something: Something) {} 

Entonces esta llamada:

 call { // do something } 

Generaría un error de desajuste de tipo. ¿Por qué?

Kotlin solo admite conversiones SAM para methods Java, porque Kotlin tiene types de funciones. Normalmente, las funciones de Kotlin deberían tomar () -> Unit lugar de Something . Si realmente necesita tomar Something , puede usar un constructor SAM:

 call(Something { /* do something */ }) 

Cualquier tipo de SAM (interfaz de Java con un método abstracto) obtiene automáticamente una function de constructor que convierte una lambda en su instancia.

Kotlin requiere que la llamada tenga algo de interfaz.

 () -> Kotlin.Unit 

No satisface el requisito de tipo.

Puedes hacerlo

 call (object : Something { override fun doSomething() { println("Passing an interface to call in kotlin!") } }) 
  • Tipo de function de Kotlin en su lugar interfaz funcional lambda
  • ¿Utilizas return dentro de una lambda?
  • Enlace de datos: el campo Observable con valor lambda no comstack
  • Configuración de oyentes de Android en Kotlin: uso del retorno en lambdas
  • ¿Cómo usar la expresión Lamba para hacer que las llamadas al método Java sean less detalladas en Kotlin?
  • Kotin Cómo especificar la label de devolución cuando se incluye en Lambda
  • Kotlin: lambda nunca comstack
  • ¿Cómo crear una instancia de interfaz anónima en Kotlin?
  • Pasando lambda en lugar de interfaz
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Kotlin no puede acceder a kotlin.jvm.functions.Function1 cuando llama a la function kotlin con java lambda