Java 对比 Kotlin 泛型
Java vs Kotlin generics
我有以下 Java class 我正在尝试转换为使用泛型的 Kotlin。
抽象class 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 class 时,我如何才能摆脱错误,只是所以我可以将 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
}
}
将摘要class改为以下代码
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 class 我正在尝试转换为使用泛型的 Kotlin。
抽象class 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 class 时,我如何才能摆脱错误,只是所以我可以将 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
}
}
将摘要class改为以下代码
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
}
}