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.

  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • Funciones de extensión Kotlin por tipo
  • Cómo organizar los methods de extensión de Kotlin
  • En kotlin, cómo devolver una instancia definida por un parámetro de class genérico
  • Propiedad de extensión en línea Kotlin
  • ¿A los miembros protegidos no se puede acceder en las funciones de extensión?
  • Función de extensión Kotlin en propiedad mutable
  • Comtesting si mi actividad está en MultiWindowMode o no está usando Kotlin
  • Función de queue Kotlin List
  • Complemento de estudio Android con id: 'kotlin-android-extensions'
  • ¿Cómo crear una class estática en Kotlin?