La function miembro no se puede usar como argumento

Con el siguiente código:

fun someFun(x: Any) { } fun foo(bar: (val x: Any) -> Unit) { } fun baz() { foo(::someFun) } class Test { fun someFun(x: Any) { } fun foo(bar: (val x: Any) -> Unit) { } fun baz() { foo(::someFun) } } 

En el código fuera de la class, todo funciona bien, no hay error. En Test :: baz, donde se llama a foo aparece el siguiente error:

Error: (53, 13) Kotlin: Tipo no coincidente: tipo inferido es kotlin.reflect.KMemberFunction1 pero (kotlin.Any) -> kotlin.Unit era esperado

¿Por qué no puedo usar una function miembro como un argumento como este? La documentation no dice que no puedo hacer esto.

Documentación

Si necesitamos usar un miembro de una class, o una function de extensión, necesita ser calificado, y el resultado será del tipo "function de extensión", por ejemplo, String :: toCharArray nos da una function de extensión para tipo String: String. () -> CharArray.

 foo(Test::someFun) 

El tipo cambia a:

 bar: Test.(Any) -> Unit 

También puedes pasarle una lambda a la function para evitar esto:

 foo { bar -> someFun(bar) } 

dentro de la class de testing

cambiar el código

 fun baz() { foo(::someFun) } 

a

 fun baz() { foo(this::someFun) } 

¡resolvería el problema!

si quieres hacer reference a un tipo de function, digamos

 (Int,Int)->String 

y tienes class A

 class A{ fun whatever(a:Int,b:Int) = "${a},${b}" } 

puede hacer reference a la function usando A()::whatever que A()::whatever A () significa una instancia de A

  • No se puede llamar a StartActivityForResult en Anko
  • Cómo establecer maxLength en Anko
  • Observable para reutilizar ejecuciones de operadores
  • ¿Cuáles son los casos de uso de las properties en línea de Kotlin?
  • Requiere Anotaciones de la emisión con "allOf" en Kotlin
  • Memoración de la function miembro de la class de datos Kotlin
  • ¿Cómo probar el método del presentador en base a un valor devuelto por Observable?
  • ¿Cuál es la diferencia en las dos opciones de "crear proyecto" de JVM Kotlin en IntelliJ?
  • Temporizador RxJava2 y combinar
  • kotlin, ¿cómo simplificar pasar los parameters al constructor de la class base?
  • Daga 2, no puedo inyectar presentador en mi actividad