【问题标题】:Kotlin: resolve generic inheritanceKotlin:解决泛型继承
【发布时间】:2017-11-21 13:10:02
【问题描述】:

在阅读了相同的文章后,我仍然无法解决泛型问题:

我有 BaseActivity:

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

BaseView 接口

interface BaseView : MvpView

而且肯定是 BasePresenter

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

然后我创建 BaseConnectionView

interface BaseConnectionView : BaseView

和 BaseConnectionPresenter

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

所以当我创建 BaseConnectionActivity 时

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

我有错误:

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

它是子类型!

我该如何解决这个问题?

【问题讨论】:

标签: android kotlin moxy android-moxy


【解决方案1】:

BaseConnectionPresenterBasePresenter&lt;T&gt;T: BaseConnectionView 的子类型。函数getPresenter 只返回BasePresenter&lt;BaseView&gt;。有一个问题,因为BasePresenter&lt;T&gt; 不保证是BasePresenter&lt;BaseView&gt;。以下修复它:

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

【讨论】:

  • 那么在这种情况下,当我有类似 class:RealPresenter : BaseConnectionPresenter()
  • 如果将 BaseView 传递给 BasePresenter,也无法从 BaseConnectionView 正确使用 Moxy 中的 viewState
【解决方案2】:

如果使用星形投影,解决方案比我想象的要容易

所以在 BaseActivity 我替换了

abstract fun getPresenter():BasePresenter<BaseView>

abstract fun getPresenter():BasePresenter<*>

然后我可以用新的演示者覆盖它,比如

override abstract fun getPresenter(): BaseConnectionPresenter<*>

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多