Genéricos de Kotlin: Aplicación de una interfaz para MVP

En el siguiente ejemplo, entiendo que BaseActivity no se puede suministrar como el argumento de presenter.onAttached , aunque implementa la interfaz BaseView, que parece que es lo mismo que V. Se puede suministrar una presentación a Presenter en una subclass de BaseView, por ej. MainPresenter<MainView> , lo que significa que BaseView no es lo suficientemente específico.

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

Sin embargo, todavía necesito decirle al presentador cuál es su punto de vista al pasar una reference a la actividad de implementación. Idealmente, puedo hacer todo esto desde las classs Base para que los detalles de implementación de MVP sean casi invisibles para la implementación de classs.

He encontrado dos forms de hacerlo, pero tienen sus problemas:

1. Podría hacer que cada actividad de implementación anule un campo V , pero cada actividad de implementación tendría la misma línea de código idéntica. Repetitivo mucho? Tampoco parece estar en el espíritu de los generics.

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

2. Podría suponer que this es siempre una V e ignorar el error de pelusa. Sin embargo, esto es peligroso y nuevamente no está en el espíritu de los generics.

 presenter.onAttached(this as V) 

¿Hay una forma sexy de hacer todo esto en Kotlin? ¿Algún tipo de restricción que todas las classs que extienden BaseActivity tienen que implementar algún tipo de BaseView por ejemplo?