Насправді у мене було саме це запитання 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
формат замість фактичного імені класу), але це найближче, що можна досягти зараз порівняно з фактичними статичними функціями. Сподіваємось, виробники мов Котлін відповідуть на проблему, яку створили, і додадуть цю особливість у мові.