Почему график кинжала работает в java, а в Kotlin он говорит, что отсутствует Предоставляет, когда я предоставил? - PullRequest
1 голос
/ 04 мая 2020

У меня есть некоторые проблемы при преобразовании интерфейсов кинжалов из java в Kotlin

Я получил [Dagger / MissingBinding] java .util.Map не может быть предоставлен без аннотируемого метода @ Provides.

Вот мой интерфейс

   interface TopicConfigModule {
    @Binds
    @IntoMap
    @StringKey(NAME)
    fun bindCommandHandler(handler: TopicCommandHandler): CommandHandler

    companion object {
        @JvmStatic
        @Provides
        @FragmentScope
        fun provideHubsConfig(
            commandRegistry: Map<String, CommandHandler>
        ): Config {
            return ...
        }
    }
}

, а CommandHandler - java interface

public interface HubsCommandHandler {```}


1 Ответ

3 голосов
/ 04 мая 2020

Map в Kotlin является ковариантным ( дисперсия ) для своего типа значения (public interface Map<K, out V>), но Map в Java - нет. Ваша функция будет переведена в

Config provideHubsConfig(Map<String, ? extends CommandHandler> commandRegistry) { ... }

, но кинжал обеспечивает точно Map<String, CommandHandler>. Поэтому нам нужно подавить подстановочные знаки с помощью @JvmSuppressWildcards

commandRegistry: Map<String, @JvmSuppressWildcards CommandHandler>

Вызов Kotlin из Java - вариант-дженерики

...