top new functions fun java lambda kotlin

java - new - Expresiones lambda en Kotlin



new in kotlin (2)

Considere la siguiente clase 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 falta de coincidencia de tipo. ¿Por qué?


Kotlin requiere que la llamada tome algo de interfaz something .

() -> Kotlin.Unit

No cumple con el requisito de tipo.

Puedes hacerlo

call (object : Something { override fun doSomething() { println("Passing an interface to call in kotlin!") } })


Kotlin solo admite conversiones SAM para métodos Java, ya que Kotlin tiene tipos de funciones. Normalmente, las funciones de Kotlin deberían tomar () -> Unit lugar de Something . Si realmente lo necesitas para tomar Something , puedes usar un constructor de SAM:

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

Cualquier tipo de SAM (interfaz Java con un método abstracto) obtiene automáticamente una función constructora de este tipo que convierte un lambda a su instancia.