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:
- acceso al método de extensión kotlin en otro kt
- ¿A los miembros protegidos no se puede acceder en las funciones de extensión?
- ¿Cómo colocar una extensión de Kotlin en un file de class?
- Kotlin: ¿Cómo ejecutar methods de service en el context de una class de transacción?
- While loop en el lenguaje de progtwigción Kotlin
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 !
- Kotlin: ¿Cuando la function de extensión oculta la implementación pnetworkingeterminada de la class?
- ¿Convertir mi proyecto de estudio andorid existente a kotlin?
- Cómo extender una class de datos con toString
- Problema con el método de extensión en el script de Kotlin
- Kotlin class NoClassDefFoundError crash
- Modificar "esto" en la function de extensión
- Establecer una extensión de kotlin
- Usa la extensión Kotlin en la class java de Android
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.
- Llamar al método de una class como arg por defecto en el constructor
- ¿Por qué no se puede acceder al object dentro de un object compañero de Kotlin "estáticamente" cuando otros miembros pueden?