【问题标题】:Java vs Kotlin genericsJava 与 Kotlin 泛型
【发布时间】:2017-11-03 14:45:41
【问题描述】:

我正在尝试将以下 Java 类转换为使用泛型的 Kotlin。

抽象类 MvpViewHolder, M, V : View?>(itemView: View) : RecyclerView.ViewHolder(itemView) {

public abstract class MvpViewHolder<P extends BasePresenter> extends RecyclerView.ViewHolder {
    protected P presenter;

    public MvpViewHolder(View itemView) {
        super(itemView);
    }

    public void bindPresenter(P presenter) {
        this.presenter = presenter;
        presenter.bindView(this);
    }

    public void unbindPresenter() {
        presenter = null;
    }
}

这是我的 Kotlin 尝试

abstract class MvpViewHolder<P : BasePresenter>(itemView: View) : RecyclerView.ViewHolder(itemView) {

    protected var presenter: P? = null

    fun bindPresenter(presenter: P?): Unit {
        this.presenter = presenter
        presenter?.bindView(this)

    }

    fun unbindPresenter(): Unit {
        this.presenter = null
    }
}

我特别遇到了泛型问题。事实证明,在 Kotlin 中,仅仅做 MvpViewHolder&lt;P : BasePresenter&gt; 是不够的,因为 Kotlin 要求我们为 BasePresenter 传递 2 种类型的参数(我把它的实现放在下面)

但是,如果我需要传入 BasePresenter 的类型参数,那么我的方法签名将如下所示

`abstract class MvpViewHolder<P : BasePresenter<*, *>>(itemView: View) : RecyclerView.ViewHolder(itemView) {`

然而,这对我没有帮助,因为在 presenter.bindView(this) 中我收到了 Required: Nothing, Found: MvpViewHolder 的类型错误

我也可以更具体并传递 MvpViewHolder&lt;P: BasePresenter&lt;M, V&gt;, M, V&gt; 但这意味着无论我在哪里调用 MvpViewHolder,我还必须包含 2 个额外的类型参数。现在必须维护不仅会很乏味,而且只会让我难过。

当我使用 BasePresenter,> 时如何摆脱错误或避免将 3 个类型参数传递到我的 MvpViewHolder 类中,这样我就可以将 P 定义为 @987654328 @

abstract class BasePresenter<M, 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
    }

}

【问题讨论】:

    标签: java generics kotlin kotlin-android-extensions


    【解决方案1】:

    将抽象类改成如下代码

     abstract class MvpViewHolder<P :BasePresenter<P,MvpViewHolder<P>>>(itemView: View) : RecyclerView.ViewHolder(itemView) {
            protected var presenter: P? = null
            fun bindPresenter(presenter: P) {
                this.presenter = presenter
                presenter.bindView(this)
            }
    
            fun unbindPresenter() {
                presenter = null
            }
        }
    

    【讨论】:

    • 扩展 MvpViewHolder 的类会发生什么?我如何将参数传递给它? open class VenuesViewHolder(itemView: View) : MvpViewHolder&lt;VenuePresenter&gt;(itemView), VenueView 这是一个例子。扩展 BasePresenter 的 VenuePresenter 抛出一个错误,表明它不在其范围内
    • 如果你愿意,我可以把它变成另一个问题
    • open class VenuesViewHolder&lt;M,P:BasePresenter&lt;P, MvpViewHolder&lt;P&gt;&gt;&gt;(itemView: View) : MvpViewHolder&lt;P&gt;(itemView) 您的演示者将如下所示class VenuePresenter&lt;P:BasePresenter&lt;P, MvpViewHolder&lt;P&gt;&gt;,M:MvpViewHolder&lt;P&gt;&gt; :BasePresenter&lt;P,M&gt;(){ override fun updateView() { }
    • 这里的模式是什么?您正在使用任何资源吗?
    • 我只是指 Java 泛型和 kotlin 泛型。只需查看 ide 本身的错误消息即可纠正错误
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多