简体   繁体   English

Kotlin:解决泛型继承

[英]Kotlin: resolve generic inheritance

After reading same articles I still cannot solve generics problem: 阅读相同的文章后,我仍然无法解决泛型问题:

I have BaseActivity: 我有BaseActivity:

abstract class BaseActivity : MvpAppCompatActivity(), BaseView {
    abstract fun getPresenter():BasePresenter<BaseView>
}

BaseView interface for it 它的BaseView接口

interface BaseView : MvpView

And for sure BasePresenter 可以肯定的是,BasePresenter

open class BasePresenter<T : BaseView> : MvpPresenter<T>() 

Then I create BaseConnectionView 然后我创建BaseConnectionView

interface BaseConnectionView : BaseView

And BaseConnectionPresenter 和BaseConnectionPresenter

class BaseConnectionPresenter<T : BaseConnectionView> : BasePresenter<T>()

So when I create BaseConnectionActivity 所以当我创建BaseConnectionActivity

abstract class BaseConnectionActivity : BaseActivity(),BaseConnectionView {
    override abstract fun getPresenter(): BaseConnectionPresenter<BaseConnectionView>
}

I have error: 我有错误:

Return type is BaseConnectionPresenter<BaseConnectionView>, 
which is not a subtype of overridden 
public abstract fun getPresenter():BasePresenter<BaseView>

But it is subtype! 但这亚型!

How can I solve this problem? 我怎么解决这个问题?

BaseConnectionPresenter is a subtyp of BasePresenter<T> with T: BaseConnectionView . BaseConnectionPresenterBasePresenter<T>带有T: BaseConnectionView The function getPresenter only returns BasePresenter<BaseView> . 函数getPresenter仅返回BasePresenter<BaseView> There's a problem because BasePresenter<T> is not garanteed to be BasePresenter<BaseView> . 有一个问题,因为BasePresenter<T>不保证是BasePresenter<BaseView> The following fixes it: 以下内容可解决此问题:

class BaseConnectionPresenter<T : BaseConnectionView> : BasePresenter<BaseView>()

Solution was easier than I think if use star-projections 如果使用星形投影,解决方案比我想象的要容易

So in BaseActivity I replaced 所以在BaseActivity中,我替换了

abstract fun getPresenter():BasePresenter<BaseView>

To

abstract fun getPresenter():BasePresenter<*>

And then I can just override it with new presenter, like 然后我可以用新的演示者覆盖它,例如

override abstract fun getPresenter(): BaseConnectionPresenter<*>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM