Методы экземпляра имеют приоритет над функциями расширения, в случае конфликта сигнатур, поэтому ожидаемое поведение является ожидаемым.
Вы можете напрямую обратиться к shadowed импорту функции расширенияэто с псевдонимом: представьте, что у вас есть файл FragmentExt.kt
, содержащий метод расширения в пакете с именем mypkg
:
package mypkg
fun Fragment.showToast(message: String, toastLength: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, message, toastLength).show()
}
Итак, вы можете вызвать функцию расширения (избегая вызова метода экземпляра) следующим образом:
import mypkg.showToast as extShowToast
val fragment : Fragment = ...
fragment.extShowToast(message)
Этот подход работает как в подклассе MyFragment
, так и в любом клиентском классе.
В коде Java вы можете сделать что-то похожее, используя метод расширения Kotlin как статический метод.для имен классов по имени файла: если ваша функция расширения находится в FragmentExt.kt
, код Java может указывать на метод расширения, используя FragmentExtKt.showToats("Message here")
.