Aslında 30 dakika önce bu soruyu sordum, bu yüzden kazmaya başladım ve bunun için herhangi bir çözüm veya geçici çözüm bulamadım, ancak arama yaparken Kotlinglang web sitesinde bu bölümü buldum :
Uzantıların boş bir alıcı türüyle tanımlanabileceğini unutmayın. Bu uzantılar, değeri boş olsa bile bir nesne değişkeninde çağrılabilir.
Öyleyse, en çılgın fikrim vardı, neden boş bir alıcıyla (aslında bu alıcıyı kullanmadan) bir uzatma işlevi tanımlamıyorsunuz ve null bir nesnede çağırıyorsunuz! Bu yüzden denedim ve oldukça iyi çalıştı, ama çok çirkin görünüyordu. Şöyleydi:
(null as Type?).staticFunction(param1, param2)
Bu yüzden, alıcı türü uzantıları dosyamda null değeri olan bir val oluşturarak ve sonra diğer sınıfımda kullanarak bunu dolaştım. Yani, örnek olarak, ben Navigation
Android için sınıf için bir "statik" uzantısı işlevini nasıl uygulandığı : NavigationExtensions.kt dosyamda:
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) }
}
Bunu kullanan kodda:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
Açıkçası, bu bir sınıf adı değil, sadece bir null değeri olan sınıf türünün bir değişkeni. Bu açıkça uzantı yapıcı tarafında (değişkeni yaratmak zorunda oldukları için) ve geliştirici tarafında ( SType
gerçek sınıf adı yerine biçimi kullanmak zorunda oldukları için) çirkin , ama şu anda elde edilebilecek en yakın olanı gerçek statik fonksiyonlara kıyasla. İnşallah, Kotlin dil yapıcıları oluşturulan soruna cevap verecek ve bu özelliği dile ekleyeceklerdir.