Kotlinでジェネリッククラスを拡張する

Extending generic class in Kotlin


質問 written by henorek @2016-06-08 21:08:42Z

: 6 : 1 : 3

このサンプルコードがJavaにあるとしましょう。

public class MyActivityDelegate implements ActivityMvpDelegate

ここで、ActivityMvpDelegate:

interface ActivityMvpDelegate<V extends MvpView, P extends MvpPresenter<V>>

Kotlinに変換された同じコードは次のようになります

class MyActivityDelegate(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<V>>

もちろん、 V未解決の参照を得たため、このコードがどのように見えるかわかりません。Javaでは、ここでジェネリックを指定する必要はありません。

コメント 1

javaサンプルpublic class MyActivityDelegate implements ActivityMvpDelegateていると、不完全に見えます(どちらもコンパイルされません)。これがMyActivityDelegate正確な宣言ですか?

written by miensol @2016-06-08 21:38:14Z

コメント 2

はい、そうです、コンパイルします

written by -henorek @2016-06-09 06:44:39Z

回答 1 written by hotkey @2016-06-09 11:28:18Z
6

あなたのインターフェース宣言はそれを必要とします

  • VMvpView拡張しMvpView
  • V (サブタイプではなく、正確にV )は、 P extends MvpPresenter<V>するP extends MvpPresenter<V>汎用パラメーターとして使用されます

Vが正確にMvpViewあるという保証がないためActivityMvpDelegate<MvpView, MvpPresenter<V>>拡張することはできません(また、Kotlinでは、ジェネリックパラメーターが暗黙的に継承されないため、 class SomeClass<T> : SomeInterface<T>ように再宣言する必要がありますclass SomeClass<T> : SomeInterface<T> )。

ただし、次のように書くことができます

class MyActivityDelegate(private val activity: Activity) 
: ActivityMvpDelegate<MvpView, MvpPresenter<MvpView>>

または、別のジェネリックパラメーターを導入して、 VPの引数が同じになるようにします。

or introduce another generic parameter, so that V and the argument for P are still the same:

インターフェイスのジェネリック宣言を、 P extends MvpPresenter<V>からP extends MvpPresenter<? extends V>変更することもできますP extends MvpPresenter<? extends V> P extends MvpPresenter<? extends V> (またはKotlinでout Vを使用)、 Vサブタイプを引数として使用できます(バインドされたジェネリックを含む):

class MyActivityDelegate<T : MvpView>(private val activity: Activity) 
: ActivityMvpDelegate<T, MvpPresenter<T>>