Генераторы Kotlin: использование интерфейса для MVP

В приведенном ниже примере я понимаю, что BaseActivity не может быть предоставлен в качестве аргумента presenter.onAttached , хотя он реализует интерфейс BaseView, который выглядит так же, как V. Реализующему Presenter может быть предоставлен подкласс BaseView, например MainPresenter<MainView> , что означает, что BaseView недостаточно специфичен.

 abstract class BaseActivity<V : BaseView, out P : BasePresenter<V>> : AppCompatActivity(), BaseView { abstract val presenter : P override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(this) // Type mismatch } } 

Однако мне все еще нужно сообщить докладчику, каково его мнение, путем передачи ссылки на реализацию. В идеале я могу сделать все это из базовых классов, чтобы детали реализации MVP были почти незаметны для реализации классов.

Я нашел два способа сделать это, но у них есть свои проблемы:

1. Я мог бы сделать каждую реализацию, переопределяющую поле V , но каждая отдельная реализация будет иметь одинаковую идентичную строку кода! Бойлер много? Это также не похоже на дух дженериков.

 // base abstract val view : V override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(view) } // impl override val view = this 

2. Я мог бы просто предположить, что this всегда V и игнорировать ошибку lint. Однако это опасно и снова не в духе дженериков.

 presenter.onAttached(this as V) 

Есть ли сексуальный способ сделать все это в Котлине? Какое-то ограничение, что все классы, расширяющие BaseActivity, должны каким-то образом использовать BaseView?