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

  • ImageButton OnClickListener no funciona
  • La testing de instrumento Android con Espresso falla: NoSuchMethodError get () en javax.inject.Provider
  • No se puede hacer que la API invoque urlfetch.Fetch en un hilo que no sea el hilo de request original ni un hilo creado por ThreadManager
  • Las annotations en time de ejecución anotadas en una class archivada en kotlin no se generan correctamente
  • Obteniendo un error al tratar con getter y setter en kotlin
  • kotlin no resuelto enlace KDoc pero a IntelliJ no le gusta la import que lo arregla
  • ¿Cuál es la razón detrás de "reference no resuelta" cuando se usa kotlin para FacebookLogin?
  • Android Things UserSensor.Builder: no se puede crear un controller de sensor de distancia
  • Argumentos no utilizados al destruir un object en Kotlin
  • ControlsFX SpreadsheetView rowspan IndexOutOfBoundsException
  • Intentando escribir un código eficiente para actualizar el color de background usando Kotlin