tengo una extensión
fun Fragment.showToast(message: String, toastLength: Int = Toast.LENGTH_SHORT) { Toast.makeText(context, message, toastLength).show() }En el proyecto estamos usando MVP:
interface MyContract { interface View { fun showToast(message: String) } } class MyFragment : Fragment(), MyContract.View { override fun showToast(message: String) { showToast(message) } } Entonces, en MyFragment.showToast(message) espero llamar a la función de extensión en lugar de StackOverflowException .
¿Es posible llamar directamente a la función de extensión? Algo como:
Fragment.showToast(this, message)o solo necesito dar otro nombre?
Podría convertir su clase MyFragment en Fragment y hacer:
class MyFragment : Fragment(), MyContract.View { override fun showToast(message: String) { val fragment = this as Fragment fragment.showToast(message) } }De esta forma te referirás a la función de extensión de la clase Fragment
Los métodos de instancia tienen prioridad sobre las funciones de extensión, en caso de conflicto de firmas, por lo que el comportamiento que está experimentando es el esperado.
Puede hacer referencia directamente a la función de extensión sombreada importándola con un alias: suponga que tiene un archivo FragmentExt.kt que contiene el método de extensión en un paquete llamado mypkg :
package mypkg fun Fragment.showToast(message: String, toastLength: Int = Toast.LENGTH_SHORT) { Toast.makeText(context, message, toastLength).show() }Por lo tanto, puede invocar la función de extensión (evitando llamar al método de instancia) de la siguiente manera:
import mypkg.showToast as extShowToast val fragment : Fragment = ... fragment.extShowToast(message) Este enfoque funciona tanto en la subclase MyFragment como en cualquier clase de cliente.
En el código Java, puede hacer algo similar accediendo al método de extensión de Kotlin como un método estático en los nombres de clase por el nombre del archivo: si su función de extensión está en FragmentExt.kt , el código Java puede apuntar al método de extensión usando FragmentExtKt.showToats("Message here") .
Tiene dos métodos a los que puede llamar en una instancia de Fragment con exactamente el mismo nombre y los mismos parámetros.
No hay forma de distinguir a cuál quieres llamar.
Cambiaría el nombre de uno.
P.ej
fun Fragment.toast(message: String, toastLength: Int = Toast.LENGTH_SHORT) { Toast.makeText(context, message, toastLength).show() }