1

次の基本クラスを 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. MyVenueListPresenterBasePresenter<Venue, VenueView>whereVenueを拡張し、デフォルトでそれを拡張するためVenueView、タイプです。Any?では、なぜ機能しないのでしょうか。

MvpViewHolder はそのように定義されています

abstract class MvpViewHolder<P>(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter<Any?, Any?>
4

1 に答える 1