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<*>