У меня действительно был этот точный вопрос 30 минут назад, поэтому я начал копаться и не мог найти никакого решения или обходного пути для этого, НО во время поиска я нашел этот раздел на веб-сайте Kotlinglang, в котором говорится, что:
Обратите внимание, что расширения могут быть определены с обнуляемым типом получателя. Такие расширения могут быть вызваны для переменной объекта, даже если ее значение равно нулю.
Тогда у меня возникла самая сумасшедшая идея, почему бы не определить функцию расширения с обнуляемым получателем (без фактического использования этого получателя), а затем вызвать ее для нулевого объекта! Я попробовал это, и это сработало довольно хорошо, но выглядело так ужасно. Это было так:
(null as Type?).staticFunction(param1, param2)
Поэтому я обошел это, создав val в моем файле расширений типа приемника со значением null, а затем использовал его в моем другом классе. Итак, в качестве примера, вот как я реализовал «статическую» функцию расширения для Navigation
класса в Android: В моем файле NavigationExtensions.kt:
val SNavigation: Navigation? = null
fun Navigation?.createNavigateOnClickListener(@IdRes resId: Int, args: Bundle? = null, navOptions: NavOptions? = null,
navigationExtras: Navigator.Extras? = null) : (View) -> Unit {
//This is just implementation details, don't worry too much about them, just focus on the Navigation? part in the method declaration
return { view: View -> view.navigate(resId, args, navOptions, navigationExtras) }
}
В коде, который использует это:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
Очевидно, что это не имя класса, это просто переменная типа класса, которая имеет нулевое значение. Это явно уродливо на стороне создателя расширений (потому что они должны создать переменную) и на стороне разработчика (потому что они должны использовать SType
формат вместо фактического имени класса), но это самое близкое, что может быть достигнуто прямо сейчас по сравнению с реальными статическими функциями. Надеемся, что создатели языка Kotlin ответят на созданную проблему и добавят эту функцию в язык.