为什么不能匕首处理这些kotlingenerics?

我有一些奇怪的kotlin与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() 

当我构建时,我在顶层组件中得到这个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 cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.List is injected at e: com.daykm.p5executioner.view.PageableAdapter.(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 

我看了一下生成的存根:

 @javax.inject.Inject() public PageableAdapter(@org.jetbrains.annotations.NotNull() java.util.List pageables, @org.jetbrains.annotations.NotNull() android.support.v7.widget.RecyclerView.RecycledViewPool pool) { super(); } @org.jetbrains.annotations.NotNull() @dagger.Provides() public final java.util.List adapters(@org.jetbrains.annotations.NotNull() 

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

 @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() 

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

Kotlin的List转化为Java的List协变性List List默认情况下。 匕首不喜欢那样。

为了解决这个问题,你可以切换到MutableList ,或者写List<@JvmSuppressWildcards E>