gpt4 book ai didi

Java 与 Kotlin 泛型

转载 作者:行者123 更新时间:2023-12-02 12:03:15 25 4
gpt4 key购买 nike

我正在尝试将以下 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<P : BasePresenter> 是不够的,因为 Kotlin 要求我们传入 BasePresenter 的 2 个类型参数(我将其实现放在下面)

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

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

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

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

如何在使用 BasePresenter<,> 时消除错误,或者避免将 3 个类型参数传递到我的 MvpViewHolder 类中,这样我就可以将 P 定义为 BasePresenter

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
}

}

最佳答案

将抽象类更改为以下代码

 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
}
}

关于Java 与 Kotlin 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47088390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com