Kotlin Pass en un tipo que implementa una interfaz parametrizada

Tengo el siguiente código de Java que funciona, pero cuando lo convierto en Kotlin, el código no comstack

Código Java

public interface Presenter<V> { void attachView(V view); } 

Clase abstracta que implementa la interfaz anterior

 public abstract class BasePresenter<T> implements Presenter<T> { @Override public void attachView(T view) { this.view = view; } } 

Clase abstracta que toma un parámetro Tipo que implementa la interfaz anterior

 public abstract class PresenterActivity<P extends Presenter> extends BaseActivity { protected P presenter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (presenter != null) { presenter.attachView(this); } } } 

Una class que extiende BasePresenter

 public class FooPresenter extends BasePresenter<BarView> { ... } 

Una class que extiende PresenterActivity

 public class SomeActivity extends PresenterActivity<FooPresenter> implements BarView { .... } 

Código Kotlin convertido desde el código Java anterior

 interface Presenter<in V> { fun attachView(view: V) } 

Clase abstracta que implementa la interfaz anterior

 abstract class BasePresenter<V> : Presenter<V> { override fun attachView(view: V) { this.view = view } } 

La class abstracta que toma un parámetro Type que implementa la interfaz anterior, no estoy seguro si <P : Presenter<Any>> debajo, es la expresión correcta

 abstract class PresenterActivity<P : Presenter<Any>> : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (presenter != null) { presenter!!.attachView(this) } } } 

Una class que extiende BasePresenter

 class FooPresenter : BasePresenter<BarView>() { .... } 

Una class que extiende PresenterActivity

 class SomeActivity : PresenterActivity<FooPresenter>(), BarView { .... } 

La class Kotlin PresenterActivity proporciona el siguiente error de compilation Error: (9, 44) El argumento de tipo no está dentro de sus límites: debe ser un subtipo de ' Presenter<Any> '

esto significa que FooPresenter no se graba como un subtipo de Presenter<Any>

supongo que el Presenter<V> es una subclass de Presenter<Any> , tengo la sensación de que estoy equivocado

Su código Java en realidad tiene un problema de security tipo: PresenterActivity<P extends Presenter> usa un tipo sin formatting y cuando luego escribe presenter.attachView(this) no sabe si puede adjuntarlo, pero el tipo sin formatting significa que el comstackdor no lo hace Te lo advierto. Kotlin no te permite esconderlo así.

supongo que el Presenter<V> es una subclass de Presenter<Any> , tengo la sensación de que estoy equivocado

in realidad significa que el Presenter<V> es un super- tipo de Presenter<Any> , no un subtipo. Consulte https://kotlinlang.org/docs/reference/generics.html (o busque covarianza y contravarianza, hay muchas explicaciones sobre Stack Overflow y, de lo contrario, aunque más para Scala que para Kotlin, pero la idea es la misma).

Creo que la solución más simple sería algo así como

 // concrete subclasses must extend V abstract class PresenterActivity<V, P : Presenter<V>> : BaseActivity() { ... presenter!!.attachView(this as V) } 

y

 class SomeActivity : PresenterActivity<BarView, FooPresenter>(), BarView { .... }