gpt4 book ai didi

android - Kotlin未实例化的类列表

转载 作者:行者123 更新时间:2023-12-02 12:41:00 34 4
gpt4 key购买 nike

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

关于android - Kotlin未实例化的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60467867/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com