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
的任何子类型传递给这个方法。MyBaseMvpActivity
实现此接口。那怎么了?听着,不,直到26秒前你的编辑,它才实现这个界面。但即便如此。列表只接受T。即使Int和Double扩展了数字,也不能将Int或Double添加到这样的列表中,因为Int和Double与T的类型不同。MyBaseActivity
实现了MvpView
。我只是编辑了一下,让它更明显。是的,关于列表类比,你是对的。那么如何使此代码可编译呢?抽象类BaseMvpActivity
将进行编译。attachView()需要一个T作为参数。您正在传递此this
不是泛型类型T。它甚至不是MvpView,而MvpView是T应该实现的。看,我应该将MvpView
的任何子类型传递给这个方法。MyBaseMvpActivity
实现此接口。那怎么了?听着,不,直到26秒前你的编辑,它才实现这个界面。但即便如此。列表只接受T。即使Int和Double扩展了数字,也不能将Int或Double添加到这样的列表中,因为Int和Double与T的类型不同。MyBaseActivity
实现了MvpView
。我只是编辑了一下,让它更明显。是的,关于列表类比,你是对的。那么如何使此代码可编译呢?抽象类BaseMvpActivity
将进行编译。Java代码只进行编译(带有警告),因为您使用的是原始类型,而不是正确键入的tour变量。替换MvpViewSubClass class1=新的MvpViewSubClass()代码>由
MvpViewSubClassclass1=新的MvpViewSubClass()代码>,它也不会像预期的那样编译。。我的错。。让我想想then@JBNizet我已经更改了答案,请检查并让我知道,您对此有何看法。Java代码只会编译(带有警告),因为您使用的是原始类型,而不是正确键入tour变量。替换
MvpViewSubClass class1=新的MvpViewSubClass()代码>由
MvpViewSubClassclass1=新的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
}
}