Genéricos Java vs Kotlin

Tengo la siguiente class de Java que bash convertir a Kotlin que usa generics.

class abstracta MvpViewHolder, M, V: Ver?> (itemView: Ver): 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; } } 

Aquí está mi bash de 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 } } 

Me encuentro particularmente con un problema con los generics. Resulta que en Kotlin simplemente no es suficiente hacer MvpViewHolder<P : BasePresenter> ya que Kotlin requiere que pasemos los 2 arguments de tipo para BasePresenter (cuya implementación pongo a continuación)

Sin embargo, si necesito pasar los arguments de tipo para BasePresenter entonces mi firma de método se vería así:

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

Esto no me ayuda, sin embargo, porque en presenter.bindView(this) me sale un error de tipo de Requinetworking: Nothing, Found: MvpViewHolder

También podría ser más específico y pasar MvpViewHolder<P: BasePresenter<M, V>, M, V> pero eso significaría que siempre que llame a MvpViewHolder, también tengo que include 2 parameters de tipo adicionales. No solo será tedioso tener que lidiar ahora con tener que mantenerlo, sino que solo me entristece.

¿Cómo puedo deshacerme del error cuando uso BasePresenter < , > o evitar tener que pasar 3 parameters de tipo en mi class MvpViewHolder, solo para poder definir P como 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 } }