Java与Kotlin泛型

我有下面的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的两个参数(下面的实现)

但是,如果我需要传入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 } }