ホーム>source

私の具象クラスでは、次のシグネチャを持つ関数が欲しいです。

ウィズウィズ

ただし、実装を交換できるように、このクラスのインターフェイスを抽出したいと思います。しかし、 inline fun <reified T : Comparable<T>> get(key: String): T にマークを付けることができないため、どうすればよいかわかりません。 virtual として機能 。

これまでのところ私はこのインターフェースを持っています:

<前>ウィズウィズ

そして、この具体的なクラス

<前>ウィズウィズ

しかし今、コンパイラーは inline でジェネリック型をオーバーライドしようとしていると不平を言っていますキーワード。このパターンを達成する方法はありますか?

interface ModuleSettings { fun <T : Comparable<T>> get(key: String) : T }
あなたの答え
  • 解決した方法 # 1

    インターフェイス関数をインライン化することはできませんが、クラスオブジェクトをパラメーターとして使用できます。引き続き同じ関数のシグネチャを取得するには、インライン化されたオーバーロードを DefaultModuleSettings に作成します  インターフェース機能に委任します。ただし、インターフェイスタイプの参照しかない場合は、これを呼び出すことはできません。

    このようなもの:

    <前>ウィズウィズ

    編集:

    インライン関数を拡張関数にするのが良いです:

    <前>ウィズウィズ

  • 解決した方法 # 2

    私は拡張機能で同様の動作を達成しました:

    <前>ウィズウィズ

    そうではありません丁度 私が達成することを期待していたものですが、それは意味的に機能します。しかし、私はまだそれを考えますハック

    interface ModuleSettings { fun <T : Comparable<T>> get(key: String, clazz: KClass<T>) : T } class DefaultModuleSettings : ModuleSettings { override fun <T : Comparable<T>> get(key: String, clazz: KClass<T>): T { TODO("not implemented") } inline fun <reified T : Comparable<T>> get(key: String): T = get(key, T::class) }

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Pythonを使用してcsvファイルのカンマを数える