Kotlin Pass в типе, который реализует параметризованный интерфейс

У меня есть следующий рабочий код Java, однако, когда я конвертирую его в Kotlin, код не компилируется

Код Java

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

Абстрактный класс, реализующий выше интерфейс

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

Абстрактный класс, который принимает параметр типа, который реализует интерфейс выше

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

Класс, расширяющий BasePresenter

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

Класс, расширяющий PresenterActivity

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

Котлинский код, преобразованный из кода Java

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

Абстрактный класс, реализующий выше интерфейс

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

Абстрактный класс, который принимает параметр Type, который реализует интерфейс выше, не уверен, что <P : Presenter<Any>> ниже, является правильным выражением

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

Класс, расширяющий BasePresenter

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

Класс, расширяющий PresenterActivity

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

Класс Kotlin PresenterActivity дает следующую ошибку компиляции Ошибка: (9, 44) Аргумент типа не находится в пределах его границ: должен быть подтип ' Presenter<Any> '

это означает, что FooPresenter не recorgnised как подтип Presenter<Any>

Я предполагаю, что Presenter<V> является подклассом Presenter<Any> , я чувствую себя неправым

Ваш Java-код действительно имеет проблему безопасности типа: PresenterActivity<P extends Presenter> использует необработанный тип, а когда вы позже пишете presenter.attachView(this) вы не знаете, можете ли вы присоединить this , но raw type означает, что компилятор не использует ' предупреждаю вас. Котлин не позволяет вам скрывать это так.

Я предполагаю, что Presenter<V> является подклассом Presenter<Any> , я чувствую себя неправым

in действительности означает, что Presenter<V> является супертипом Presenter<Any> , а не подтипом. См. https://kotlinlang.org/docs/reference/generics.html (или поиск ковариации и контравариантности, есть много объяснений по переполнению стека и в противном случае, хотя больше для Scala, чем для Kotlin, но идея такая же).

Я думаю, что самым простым решением было бы что-то вроде

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

а также

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