Miembro de Kotlin y extensión al mismo time

En un bash por comprender más sobre Kotlin y jugar con él, estoy desarrollando una aplicación de Android de muestra en la que puedo probar diferentes cosas.

Sin embargo, incluso después de search el tema por un time, no he podido encontrar una respuesta adecuada para el siguiente problema:

Declaremos una function de extensión (ficticia) en la class View:

fun View.isViewVisibility(v: Int): Boolean = visibility == v 

Ahora, ¿cómo puedo hacer reference a esta function desde otro lugar para llamar luego a invoke () en ella?

 val f: (Int) -> Boolean = View::isViewVisibility 

Actualmente me da:

Error: (57, 35) Tipo no coincidente: tipo inferido es KFunction2 pero (Int) -> Boolean era esperadoError: (57, 41) 'isViewVisibility' es un miembro y una extensión al mismo time. Las references a tales elementos no están permitidas

¿Hay algún trabajo alnetworkingedor? Gracias !

Las extensiones se resuelven estáticamente, donde el primer parámetro acepta una instancia del tipo de receptor. isViewVisibility realmente acepta dos parameters, View e Int . Entonces, el tipo correcto de esto debería ser (View, Int) -> Boolean , así:

 val f: (View, Int) -> Boolean = View::isViewVisibility 

Como solución, puede crear una function normal separada e invocarla desde un método de extensión en línea:

 inline fun View.isVisibility(v: Int): Boolean = isViewVisibility(this, v) fun isViewVisibility(v: View, k: Int): Boolean = (v.visibility == k) 

No puede llamar directamente al método de extensión porque no tiene el object implícito disponible.

Un mejor ajuste es la function de extensión tipo View.(Int) -> Boolean :

 val f: View.(Int) -> Boolean = View::isViewVisibility 

Pero en realidad los types de extensión son en su mayoría intercambiables ( compatible con asignación ) con types de funciones normales, siendo el receptor el primer parámetro:

View.(Int) -> Boolean(View, Int) -> Boolean

El uso de un tipo con dos parameters (el primero para el receptor implícito, como @Bakawaii ya ha mencionado) o un tipo de extensión deberían funcionar sin ningún tipo de advertencia.

Tomemos esta function como un ejemplo:

 fun String.foo(f: Int) = true 

Puede usar asignar esto a una propiedad que tiene un tipo de function de dos parameters como este:

 val prop: (String, Int) -> Boolean = String::foo fun bar() { prop("bar", 123) } 

O bien, puede usar un tipo de function de extensión, que luego puede llamar con cualquiera de estas dos syntax:

 val prop2: String.(Int) -> Boolean = String::foo fun bar2() { prop2("bar2", 123) "bar2".prop2(123) } 

Una vez más, todo lo anterior debería funcionar sin errores ni advertencias.

  • Tokens inesperados (uso; para separar expresiones en la misma línea)
  • ¿Convertir mi proyecto de estudio andorid existente a kotlin?
  • ¿Hay alguna diferencia entre "object receptor" y "receptor de extensión"
  • Función de extensión en el enumerador, `values ​​()` no disponible?
  • Kotlin crea problemas con Android
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • findViewById ClassCastExcpetion
  • lanza Exception en un método con Kotlin
  • No se puede resolver la cadena suministrada al parámetro vararg en la function de extensión
  • ¿Cómo colocar una extensión de Kotlin en un file de class?
  • Crear nueva instancia de object Kotlin