Android Kotlin:解析泛型继承

Android Kotlin:解析泛型继承,android,kotlin,moxy,android-moxy,Android,Kotlin,Moxy,Android Moxy,读了同样的文章后,我仍然无法解决泛型问题: 我有以下活动: abstract class BaseActivity : MvpAppCompatActivity(), BaseView { abstract fun getPresenter():BasePresenter<BaseView> } 当然,BasePresenter open class BasePresenter<T : BaseView> : MvpPresenter<T>()

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

我有以下活动:

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

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

class BaseConnectionPresenter<T : BaseConnectionView> : BasePresenter<T>()
class BaseConnectionPresenter:BasePresenter()
所以当我创建BaseConnectionActivity时

abstract class BaseConnectionActivity : BaseActivity(),BaseConnectionView {
    override abstract fun getPresenter(): BaseConnectionPresenter<BaseConnectionView>
}
抽象类BaseConnectionActivity:BaseActivity(),BaseConnectionView{ 重写抽象有趣的getPresenter():BaseConnectionPresenter } 我有一个错误:

Return type is BaseConnectionPresenter<BaseConnectionView>, 
which is not a subtype of overridden 
public abstract fun getPresenter():BasePresenter<BaseView>
返回类型为BaseConnectionPresenter,
它不是重写的子类型
公共抽象趣味getPresenter():BasePresenter
但是它是子类型


如何解决此问题?

BaseConnectionPresenter
BasePresenter
的子类型,带有
T:BaseConnectionView
。函数
getPresenter
仅返回
BasePresenter
。出现问题是因为
BasePresenter
不保证是
BasePresenter
。以下内容修复了此问题:

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

如果使用星体投影,解决方案比我想象的要简单

所以在BaseActivity中我替换了

abstract fun getPresenter():BasePresenter<BaseView>
getPresenter():BasePresenter

getPresenter():BasePresenter
然后我可以用新的演示者覆盖它,比如

override abstract fun getPresenter(): BaseConnectionPresenter<*>
重写抽象有趣的getPresenter():BaseConnectionPresenter

“但它是子类型!”它不是,解释了原因。在这种情况下,当我有类似类:RealPresenter:BaseConnectionPresenter()的内容时,我会出现相同的错误。如果将BaseView传递给BasePresenter,在Moxy中从BaseConnectionView正确使用viewState也是不可能的
abstract fun getPresenter():BasePresenter<BaseView>
abstract fun getPresenter():BasePresenter<*>
override abstract fun getPresenter(): BaseConnectionPresenter<*>