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.