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 { .... } 
  • Как удалить элементы из MutableList в Котлине
  • Я не могу инициализировать свой массив (MutableList) в классе на Android
  • Kotlin сортирует массив по значению в диапазоне
  • Показать фрагмент в виджетах android
  • Ошибка: супертипы следующих классов не могут быть разрешены. Убедитесь, что у вас есть необходимые зависимости в пути к классам
  • Компиляция Android Kotlin
  • ExpandableListView не отображается в моей деятельности
  • Как создать экземпляр универсального класса, передающего ссылку метода в конструкторе с kotlin
  • Создание класса Parcelable со вторичным конструктором, который принимает список как параметр в Kotlin
  • Interesting Posts

    .add Метод MutableList <E> throws kotlin.KotlinNullPointerException

    Нестандартное представление Android для медленного рендеринга с возможностью выделения фона

    Как передать массив строк в намерение электронной почты Android

    Как проверить, отсортирован ли массив строк в алфавитном порядке или нет с помощью Kotlin?

    Сопоставление вложенных коллекций с аннотациями JPA спящего режима? Карта <Key, Set <Значение >>

    В чем разница между основной и регулярной функцией?

    Повторное отображение диалогового окна после dismiss

    Как слить два набора перечислений в kotlin с одним и тем же родительским интерфейсом?

    Как сохранить ссылку функции как значение в типе карты и вызвать ее с параметром позже в Котлин?

    Режиссер радиопередач в Котлине

    Равенство в Котлине

    Какое надлежащее обходное решение для @BeforeAll в Котлине

    Что такое синтаксис класса <? extends class_name> в kotlin?

    Неразрешенная ссылка: createPrintDocumentAdapter (Kotlin + Android)

    Kotlin JSR-223 ScriptEngineFactory в толстой банке – Не удается найти компилятор kotlin компилятора

    Давайте будем гением компьютера.