1

将 dagger 接口从 java 转换为 Kotlin 时遇到一些问题

我得到了 [Dagger/MissingBinding] java.util.Map 如果没有 @Provides-annotated 方法就无法提供。

这是我的界面

   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 接口

public interface HubsCommandHandler {```}


4

1 回答 1

3

Map在 Kotlin 中,它的值类型 ( ) 是协变的 ( variancepublic interface Map<K, out V> ) ,但Map在 Java 中不是。您的功能将被翻译成

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

但匕首正好提供Map<String, CommandHandler>。所以我们需要用@JvmSuppressWildcards

commandRegistry: Map<String, @JvmSuppressWildcards CommandHandler>

从 Java 调用 Kotlin - 变体泛型

于 2020-05-04T19:21:31.577 回答