Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

286
Visualizações
Conflictos de nombres al usar extensión de método y herencia

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?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

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

over 4 years ago · Santiago Trujillo Relatório

0

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") .

over 4 years ago · Santiago Trujillo Relatório

0

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() }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda