私は実際にこの正確な質問を30分前に持っていたので、調べ始めましたが、これに対する解決策または回避策を見つけることができませんでしたが、検索中にKotlinglang Webサイトでこのセクションを見つけ、次のように述べています:
拡張機能はnull許容のレシーバータイプで定義できることに注意してください。そのような拡張は、その値がnullであってもオブジェクト変数で呼び出すことができます。
それで私は今までで最もクレイジーなアイデアを持っていました、なぜnull可能なレシーバーで拡張関数を定義し(実際にそのレシーバーを使用せずに)、それからそれをnullオブジェクトで呼び出してください!だから私はそれを試してみましたが、それはかなりうまくいきましたが、それはとても醜く見えました。それはこのようなものでした:
(null as Type?).staticFunction(param1, param2)
そこで、値がnullであるレシーバータイプの拡張ファイルにvalを作成し、それを他のクラスで使用することで、それを回避しました。したがって、例として、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)
明らかに、これはクラス名ではなく、null値を持つクラス型の変数です。これは明らかに、拡張機能の作成者側(変数を作成する必要があるため)および開発者側(SType
実際のクラス名の代わりに形式を使用する必要があるため)では醜いですが、現在達成できる最も近い方法です。実際の静的関数と比較して。うまくいけば、Kotlin言語メーカーが作成された問題に対応し、その機能を言語に追加することを望みます。