这个问题基本上是"Java list of uninstantiated classes"的副本但对于 Kotlin 来说。
我的用例是我有一个 FragmentStatePagerAdapter
我想传递一个 ArrayList
未实例化的Fragment
s。我有一个抽象基类 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]()
关于android - Kotlin 未实例化类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60467867/