android - Kotlin 未实例化类列表

标签 android kotlin

这个问题基本上是"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/

相关文章:

java - Android Studio中如何编写对应新实体的Java类文件?

android - 完成未停用或关闭的游标非 fatal error

amazon-s3 - 通过 Kotlin 协程并发 S3 文件上传

mysql - Spring Hibernate 无法在初始化数据库时添加外键约束

lambda - 在 lambda 中使用 return?

gradle - 将凭证放在哪里

android - 让 Android EditText 向上延伸而不是向下延伸

java - 多个开关的问题,NullPointerException

java - 设置背景颜色上的 NPE

mysql - Spring Data 在 OneToMany 上创建内部联接