这个问题基本上是"Java list of uninstantiated classes"的副本,但对于Kotlin。
我的用例是我有一个FragmentStatePagerAdapter
,我想将它传递给未实例化ArrayList
的Fragment
。我有一个抽象基类TutorialSlideFragment
,它为教程中的某些幻灯片定义了一个基本类。然后,我有20多个Fragment
,它们扩展了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
? 最佳答案
将您的类型指定为协变(out
),以便可以包含子类类型:
var tutorialSlides: ArrayList<Class<out TutorialSlideFragment>> = arrayListOf(
WelcomeFragment::class.java
)
为了使以后实例化它们更容易,您可以指定一个构造函数列表:
val tutorialSlides: ArrayList<() -> TutorialSlideFragment> = arrayListOf(
::WelcomeFragment
)
并像其他任何函数一样调用构造函数:
val newFragment = tutorialSlides[0]()