Kotlin通用边界

我正试图将我的MVP解决方案从JAVA移植到Kotlin,而我在泛型方面遇到了一个很大的问题。 这是我的JAVA类的样子:

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView public abstract class BasePresenter<V extends BaseView> public interface BaseView 

并移植到Kotlin:

 abstract class BaseActivity<P : BasePresenter<BaseView>> : AppCompatActivity(), BaseView abstract class BasePresenter<V : BaseView> interface BaseView 

而当我试图使用

 class MainActivity() : MainView, BaseActivity<MainPresenter>() 

我得到“类型参数不在其范围内,预期: BasePresenter找到MainPresenter

Java class BaseActivity声明P扩展了BasePresenter<?>Kotlin版本声明了BasePresenter<BaseView> ,这显然是不兼容的。

要解决这个问题,可以放宽BaseActivity类型参数P如下所示:

 abstract class BaseActivity<P : BasePresenter<*>> 

或者如果你希望通过编译器进行更多的类型检查,你可以像下面这样指定类型参数:

 abstract class BaseActivity<TPresenter : BasePresenter<TView>, TView : BaseView> : AppCompatActivity(), BaseView 

然后用它作为:

 class MainPresenter : BasePresenter<MainView>() class MainActivity() : MainView, BaseActivity<MainPresenter, MainView>()