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?
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").
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With