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

293
Visualizações
Name conflicts when using Method extension and Inheritance

I have an extension

fun Fragment.showToast(message: String, toastLength: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(context, message, toastLength).show()
}

In project we're using MVP:

interface MyContract {
    interface View {
        fun showToast(message: String)
    }
}

class MyFragment : Fragment(), MyContract.View {
    override fun showToast(message: String) {
        showToast(message)
    }
}

So in MyFragment.showToast(message) I expect to call extension function instead of StackOverflowException.

Is it possible to call extension function directly? Something like:

Fragment.showToast(this, message)

or I just need to give another name?

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

0

You could cast your MyFragment class to Fragment and do:

class MyFragment : Fragment(), MyContract.View {
    override fun showToast(message: String) {
        val fragment = this as Fragment
        fragment.showToast(message)
    }
}

This way you will refer to the extension function of the Fragment class

over 4 years ago · Santiago Trujillo Relatório

0

Instance methods have precedence over extension functions, in case of signature conflict, so the behaviour you're experiencing is the expected one.

You can refer directly to shadowed extension function importing it with an alias: pretend you have a file FragmentExt.kt containing the extension method in a package named mypkg:

package mypkg

fun Fragment.showToast(message: String, toastLength: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(context, message, toastLength).show()
}

So, you can invoke extension function (avoiding to call instance method) as follows:

import mypkg.showToast as extShowToast
val fragment : Fragment = ...
fragment.extShowToast(message)

This approach works both in the MyFragment subclass and in any client class.

In Java code, you can do something similar by accessing Kotlin extension method as a static method on a class names by the file name: if your extension function is in FragmentExt.kt, Java code can point to extension method using FragmentExtKt.showToats("Message here").

over 4 years ago · Santiago Trujillo Relatório

0

You've got two methods that you can call on a Fragment instance with the exact same name and the parameters.

There's no way to distinguish which one you want to call.

I'd change the name of one.

E.g.

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