The standard way (called F-bounded polymorphism) is
open class View<V: View<V, P>, P: Presenter<out V>> { ... }
It may make more sense to put out
elsewhere here, depending on the specifics:
open class View<out V: View<V, P>, out P: Presenter<V>> { ... }