这个问题基本上是"Java list of uninstantiated classes"的副本,但对于Kotlin。

我的用例是我有一个FragmentStatePagerAdapter,我想将它传递给未实例化ArrayListFragment。我有一个抽象基类TutorialSlideFragment,它为教程中的某些幻灯片定义了一个基本类。然后,我有20多个Fragment,它们扩展了TutorialSlideFragment以在需要时添加更多功能。我想传递未实例化ArrayListTutorialSlideFragment,以便适配器在需要时可以在正确的类中实例化它们。

目前,我有以下内容:
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

最佳答案

将您的类型指定为协变(out),以便可以包含子类类型:

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

为了使以后实例化它们更容易,您可以指定一个构造函数列表:
val tutorialSlides: ArrayList<() -> TutorialSlideFragment> = arrayListOf(
        ::WelcomeFragment
)

并像其他任何函数一样调用构造函数:
val newFragment = tutorialSlides[0]()

08-05 18:07