gpt4 book ai didi

kotlin - 为什么 dagger 不能处理这些 kotlin 泛型?

转载 作者:IT老高 更新时间:2023-10-28 13:43:32 25 4
gpt4 key购买 nike

我在使用 Dagger 时遇到了一些奇怪的 kotlin 通用问题,我已经解决了一些问题,但解决方案并不完善。

这是 Dagger 类:

@Module class P5Module {
@Provides fun pool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()
@Provides
fun adapters(fusion: P5FusionAdapter, personas: P5ListAdapter, skills: P5SkillsAdapter, info: InfoAdapter)
: List<Pageable> = listOf(fusion, personas, skills, info)
}

@ActivityScope
@Subcomponent(modules = arrayOf(P5Module::class)) interface P5Component {
fun adapter(): PageableAdapter
}

interface Pageable {
fun manager(ctx: Context): LayoutManager
fun attach()
fun adapter(): Adapter<*>
}

class PageableAdapter
@Inject constructor(val pageables: List<Pageable>, val pool: RecyclerView.RecycledViewPool) :PagerAdapter()

当我构建时,我在顶级组件中得到这个 kapt 错误:

e: C:\Users\daykm\StudioProjects\P5Executioner\app\build\tmp\kapt3\stubs\appDebug\com\daykm\p5executioner\AppComponent.java:17: error: [com.daykm.p5executioner.main.P5Component.adapter()] java.util.List<? extends com.daykm.p5executioner.view.Pageable> cannot be provided without an @Provides-annotated method.
e:

e: public abstract interface AppComponent {
e: ^
e: java.util.List<? extends com.daykm.p5executioner.view.Pageable> is injected at
e: com.daykm.p5executioner.view.PageableAdapter.<init>(pageables, …)
e: com.daykm.p5executioner.view.PageableAdapter is provided at
e: com.daykm.p5executioner.main.P5Component.adapter()
e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing

我查看了生成的 stub :

@javax.inject.Inject()
public PageableAdapter(@org.jetbrains.annotations.NotNull()
java.util.List<? extends com.daykm.p5executioner.view.Pageable> pageables, @org.jetbrains.annotations.NotNull()
android.support.v7.widget.RecyclerView.RecycledViewPool pool) {
super();
}

@org.jetbrains.annotations.NotNull()
@dagger.Provides()
public final java.util.List<com.daykm.p5executioner.view.Pageable> adapters(@org.jetbrains.annotations.NotNull()

显然不匹配,因为当我像这样修改 Dagger 类时:

@Module class P5Module {
@Provides fun pool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()
@Provides
fun adapters(fusion: P5FusionAdapter, personas: P5ListAdapter, skills: P5SkillsAdapter, info: InfoAdapter)
: List<*> = listOf(fusion, personas, skills, info)
}

@ActivityScope
@Subcomponent(modules = arrayOf(P5Module::class)) interface P5Component {
fun adapter(): PageableAdapter
}

interface Pageable {
fun manager(ctx: Context): LayoutManager
fun attach()
fun adapter(): Adapter<*>
}

class PageableAdapter
@Inject constructor(val pageables: List<*>, val pool: RecyclerView.RecycledViewPool) :PagerAdapter()

问题消失了。我是否遇到了协变和逆变的一些奇怪的翻译问题?我宁愿不强制下游 Actor 。

最佳答案

Kotlin 的 List<out E>转换为 Java 中的协方差 List<? extends E>默认。 Dagger 不喜欢那样。

要解决此问题,您可以切换到 MutableList<E>是不变的,或者写成List<@JvmSuppressWildcards E> .

关于kotlin - 为什么 dagger 不能处理这些 kotlin 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45384389/

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