[英]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
. BaseConnectionPresenter
是BasePresenter<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.