Kotlin список неподготовленных классов - PullRequest
2 голосов
/ 29 февраля 2020

Этот вопрос в основном является копией "Java списка необоснованных классов" , но для Kotlin.

Мой вариант использования: у меня есть FragmentStatePagerAdapter, и я хотел бы передать ему ArrayList необоснованных Fragment с. У меня есть абстрактный базовый класс TutorialSlideFragment, который определяет базовый класс c для некоторых слайдов в учебнике. Затем у меня есть 20+ Fragment s, которые расширяют TutorialSlideFragment, чтобы добавить некоторые дополнительные функции, если это необходимо. Я хотел бы передать ArrayList необработанных TutorialSlideFragment, чтобы адаптер мог при необходимости создавать их экземпляры в нужном классе.

В настоящее время у меня есть следующее:

ArrayList<Class<TutorialSlideFragment>> = arrayListOf( TutorialSlideFragment::class.java )

Это работает, но давайте не будем забывать, что TutorialSlideFragment является абстрактным, поэтому я не хочу этого делать. Я создал WelcomeSlideFragment, который расширяет TutorialSlideFragment. Если я сделаю следующее:

var tutorialSlides: ArrayList<Class<TutorialSlideFragment>> = arrayListOf(
        WelcomeFragment::class.java
)

я получу следующую ошибку:

Type inference failed. Expected type mismatch:
required:kotlin.collections.ArrayList<Class<TutorialSlideFragment>>
found:   kotlin.collections.ArrayList<Class<WelcomeFragment>>

Как я могу иметь ArrayList для необученных классов, которые расширяют базовый класс?

1 Ответ

3 голосов
/ 29 февраля 2020

Укажите ваш тип как ковариантный (out), чтобы можно было включать типы подклассов:

var tutorialSlides: ArrayList<Class<out TutorialSlideFragment>> = arrayListOf(
        WelcomeFragment::class.java
)

Или, чтобы упростить их создание позже, вы можете указать список конструкторов:

val tutorialSlides: ArrayList<() -> TutorialSlideFragment> = arrayListOf(
        ::WelcomeFragment
)

и вызовите конструкторы, как и любую другую функцию:

val newFragment = tutorialSlides[0]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...