Generics 科特林属遗传

Generics 科特林属遗传,generics,inheritance,kotlin,type-mismatch,Generics,Inheritance,Kotlin,Type Mismatch,我有个问题,解决不了。我有一个界面Presenter,它是通用的,可以采用界面的任何子类型MvpView interface Presenter<in V : MvpView> { fun attachView(view: V) fun detachView() } 我有一节课 abstract class BaseMvpActivity<P : BasePresenter<T>, T : MvpView> : BaseActivity(),

我有个问题,解决不了。我有一个界面
Presenter
,它是通用的,可以采用界面的任何子类型
MvpView

interface Presenter<in V : MvpView> {
    fun attachView(view: V)
    fun detachView()
}
我有一节课

abstract class BaseMvpActivity<P : BasePresenter<T>, T : MvpView> : BaseActivity(), MvpView {

    @Inject lateinit protected var presenter: P

    protected abstract fun inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        inject()
        initPresenter(savedInstanceState)
    }

    protected fun initPresenter(savedInstanceState: Bundle?) {
        presenter.attachView(this)
    }

    override fun onDestroy() {
        presenter.detachView()
        super.onDestroy()
    }
}

我还尝试这样做
抽象类BaseMvpActivity:BaseActivity()
,但也出现了一个错误,如
类型不匹配:推断类型为BaseMvpActivity,但没有预期结果


我怎样才能解决这个问题?谢谢。

既然不返回该泛型类型的值,为什么要将
baseprestener
设置为泛型。我们使用泛型来防止方法返回值的类型转换,并防止可能的转换异常

我想说的是,您不需要将
BasePresenter
设置为通用。只需将mvpView声明为mvpView并使用其方法。假设您确实将其设置为通用的,那么您将无法获得任何加分,因为您仍然只能访问MvpView的方法(而不是
子类

抽象类BasePresenter:Presenter{
受保护的变量mvpView:mvpView=null
受保护的获取
覆盖趣味附件视图(视图:MvpView){
this.mvpView=视图
}
覆盖视图(){
mvpView=null
}
}

希望有帮助。

既然不返回该泛型类型的值,为什么要将
baseprestener
设置为泛型。我们使用泛型来防止方法返回值的类型转换,并防止可能的转换异常

我想说的是,您不需要将
BasePresenter
设置为通用。只需将mvpView声明为mvpView并使用其方法。假设您确实将其设置为通用的,那么您将无法获得任何加分,因为您仍然只能访问MvpView的方法(而不是
子类

抽象类BasePresenter:Presenter{
受保护的变量mvpView:mvpView=null
受保护的获取
覆盖趣味附件视图(视图:MvpView){
this.mvpView=视图
}
覆盖视图(){
mvpView=null
}
}

希望有帮助。

attachView()需要一个T作为参数。您正在传递此
this
不是泛型类型T。它甚至不是MvpView,而MvpView是T应该实现的。看,我应该将
MvpView
的任何子类型传递给这个方法。My
BaseMvpActivity
实现此接口。那怎么了?听着,不,直到26秒前你的编辑,它才实现这个界面。但即便如此。列表只接受T。即使Int和Double扩展了数字,也不能将Int或Double添加到这样的列表中,因为Int和Double与T的类型不同。My
BaseActivity
实现了
MvpView
。我只是编辑了一下,让它更明显。是的,关于列表类比,你是对的。那么如何使此代码可编译呢?
抽象类BaseMvpActivity
将进行编译。attachView()需要一个T作为参数。您正在传递此
this
不是泛型类型T。它甚至不是MvpView,而MvpView是T应该实现的。看,我应该将
MvpView
的任何子类型传递给这个方法。My
BaseMvpActivity
实现此接口。那怎么了?听着,不,直到26秒前你的编辑,它才实现这个界面。但即便如此。列表只接受T。即使Int和Double扩展了数字,也不能将Int或Double添加到这样的列表中,因为Int和Double与T的类型不同。My
BaseActivity
实现了
MvpView
。我只是编辑了一下,让它更明显。是的,关于列表类比,你是对的。那么如何使此代码可编译呢?
抽象类BaseMvpActivity
将进行编译。Java代码只进行编译(带有警告),因为您使用的是原始类型,而不是正确键入的tour变量。替换
MvpViewSubClass class1=新的MvpViewSubClass

()

MvpViewSubClass

class1=新的MvpViewSubClass(),它也不会像预期的那样编译。。我的错。。让我想想then@JBNizet我已经更改了答案,请检查并让我知道,您对此有何看法。Java代码只会编译(带有警告),因为您使用的是原始类型,而不是正确键入tour变量。替换

MvpViewSubClass class1=新的MvpViewSubClass

()

MvpViewSubClass

class1=新的MvpViewSubClass(),它也不会像预期的那样编译。。我的错。。让我想想then@JBNizet我已经更改了答案,请检查并让我知道,您对此有何看法。

abstract class BaseMvpActivity<P : BasePresenter<T>, T : MvpView> : BaseActivity(), MvpView {

    @Inject lateinit protected var presenter: P

    protected abstract fun inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        inject()
        initPresenter(savedInstanceState)
    }

    protected fun initPresenter(savedInstanceState: Bundle?) {
        presenter.attachView(this)
    }

    override fun onDestroy() {
        presenter.detachView()
        super.onDestroy()
    }
}
Type mismatch: inferred type is BaseMvpActivity<P, T> but T was expected
abstract class BasePresenter : Presenter<V> {

    protected var mvpView: MvpView = null
        protected get

    override fun attachView(view: MvpView) {
        this.mvpView = view
    }

    override fun detachView() {
        mvpView = null
    }
}