在Kotlin中扩展泛型类

比方说,我有这个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中,我不必指定泛型在这里..任何提示将不胜感激

你的接口声明要求

  • V扩展MvpView
  • V (正好是V ,不是它的子类型)用作P extends MvpPresenter<V>一般参数, P extends MvpPresenter<V>

鉴于此,不能扩展ActivityMvpDelegate<MvpView, MvpPresenter<V>> ,因为不能保证V正好是MvpView (另外,在Kotlin中,泛型参数不是隐式继承的,你必须像class SomeClass<T> : SomeInterface<T>那样重新声明它们class SomeClass<T> : SomeInterface<T> )。

但是,你可以把它写成

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

或者引入另一个泛型参数,这样VP的参数仍然是一样的:

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

你也可以改变你的接口的泛型声明从P extends MvpPresenter<V>P extends MvpPresenter<? extends V> P extends MvpPresenter<? extends V> (或在Kotlin中使用out V ),你将能够使用V任何子类型作为参数,包括有界泛型:

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