Java vs Kotlin generics

У меня есть следующий класс Java, который я пытаюсь преобразовать в Kotlin, который использует generics.

абстрактный класс 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; } } 

Вот моя попытка Котлина

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

Я особенно сталкиваюсь с проблемой дженериков. Оказывается, что в Котлине просто недостаточно сделать MvpViewHolder<P : BasePresenter> поскольку Kotlin требует, чтобы мы передали аргументы типа 2 для 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 < , >, либо избежать передачи трех параметров типа в мой класс 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 } }