Kotlin通用界限

pan*_*cuh 3 generics mvp android 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 
Run Code Online (Sandbox Code Playgroud)

并移植到Kotlin:

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

abstract class BasePresenter<V : BaseView> 

interface BaseView
Run Code Online (Sandbox Code Playgroud)

当我试图使用时

class MainActivity() : MainView, BaseActivity<MainPresenter>() 
Run Code Online (Sandbox Code Playgroud)

我得到"Type参数不在其范围内.预期:BasePresenter,Found MainPresenter "

mie*_*sol 8

Java的 class BaseActivity各国P延伸BasePresenter<?>科特林版本状态BasePresenter<BaseView>,这显然是不兼容的.

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

abstract class BaseActivity<P : BasePresenter<*>>
Run Code Online (Sandbox Code Playgroud)

或者如果您希望编译器完成更多类型检查,您可以指定类型参数,view如下所示:

abstract class BaseActivity<TPresenter : BasePresenter<TView>, TView : BaseView> : AppCompatActivity(), BaseView
Run Code Online (Sandbox Code Playgroud)

然后将其用作:

class MainPresenter : BasePresenter<MainView>()
class MainActivity() : MainView, BaseActivity<MainPresenter, MainView>()
Run Code Online (Sandbox Code Playgroud)