Właściwie to miałem dokładnie to pytanie 30 minut temu, więc zacząłem kopać i nie mogłem znaleźć żadnego rozwiązania ani obejścia tego problemu, ALE podczas wyszukiwania znalazłem tę sekcję na stronie Kotlinglang, która stwierdza, że:
Należy zauważyć, że rozszerzenia można zdefiniować za pomocą typu odbiornika dopuszczającego wartość null. Takie rozszerzenia można wywołać w zmiennej obiektowej, nawet jeśli jej wartość jest równa null.
Więc wtedy wpadłem na najbardziej szalony pomysł, dlaczego nie zdefiniować funkcji rozszerzającej z odbiornikiem dopuszczającym wartość null (bez faktycznego używania tego odbiornika), a następnie wywołać ją na obiekcie zerowym! Spróbowałem tego i działało całkiem nieźle, ale wyglądało tak brzydko. To było tak:
(null as Type?).staticFunction(param1, param2)
Więc obejrzałem to, tworząc w moim pliku rozszerzeń wartość typu odbiornika, która miała wartość null, a następnie użyłem jej w mojej innej klasie. Oto przykład, jak zaimplementowałem „statyczną” funkcję rozszerzenia dla Navigation
klasy w systemie Android: W moim pliku 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) }
}
W kodzie, który go używa:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
Oczywiście nie jest to nazwa klasy, to po prostu zmienna typu klasy, która ma wartość null. Jest to oczywiście brzydkie po stronie kreatora rozszerzeń (ponieważ muszą utworzyć zmienną) i po stronie programisty (ponieważ muszą używać SType
formatu zamiast rzeczywistej nazwy klasy), ale jest to najbliższe, co można teraz osiągnąć w porównaniu z rzeczywistymi funkcjami statycznymi. Miejmy nadzieję, że twórcy języka Kotlin odpowiedzą na powstały problem i dodadzą tę funkcję do języka.