Стандартный способ (называемый F-ограниченным полиморфизмом ) -
open class View<V: View<V, P>, P: Presenter<out V>> { ... }
. Возможно, имеет смысл поместить out
в другом месте, в зависимости от особенностей:
open class View<out V: View<V, P>, out P: Presenter<V>> { ... }