次の基本クラスを 2 つのジェネリック型で定義し、それを 2 レベルの深さで使用しました (より適切な言い回しがないため)。これが私のユースケースです。
abstract class BasePresenter<out M, out V> {
var model: M? = null
var view: WeakReference<V>? = null
fun setM(model: M?): Unit {
this.model = model
if (setupDone()) {
updateView()
}
}
fun bindView(view: V) {
this.view = WeakReference(view)
}
fun unbindView() {
this.view = null
}
abstract fun updateView()
fun view(): V? {
return if (view == null) null else view?.get()
}
fun setupDone(): Boolean {
return view() != null && model != null
}
}
私はそれを使用して拡張しています
open class VenueListPresenter: BasePresenter<Venue, VenueView>() {...}
VenuListPresenter
期待どおりに動作しますが、別のクラスで型パラメーターとして使用しようとすると問題が発生します。
open class VenuesViewHolder(itemView: View): MvpViewHolder<VenueListPresenter>(itemView) {
これにより、予想される引数MvpViewHolder
が BasePresenter であり、見つかったのはVenueListPresenter
. MyVenueListPresenter
はBasePresenter<Venue, VenueView>
whereVenue
を拡張し、デフォルトでそれを拡張するためVenueView
、タイプです。Any?
では、なぜ機能しないのでしょうか。
MvpViewHolder はそのように定義されています
abstract class MvpViewHolder<P>(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter<Any?, Any?>