Почему кинжал не обрабатывает эти котлинские дженерики?

У меня есть некоторые странные общие проблемы с котлином с кинжалом, которые я как бы исправил, но решение не звучит.

Вот классы кинжалов:

@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 

Я посмотрел на созданные заглушки:

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

По-видимому, это не соответствует, потому что когда я изменяю класс кинжала так:

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

Проблема исчезает. Я нахожусь в какой-то странной проблеме перевода с ковариацией и контравариантностью? Я бы предпочел не заставлять литье вниз по течению.

List<out E> Котлин List<out E> переводится на ковариацию в List<? extends E> Java List<? extends E> List<? extends E> по умолчанию. Кинжал это не нравится.

Чтобы обойти эту проблему, вы можете либо переключиться на MutableList<E> который является инвариантным, либо записать List<@JvmSuppressWildcards E> .