将Dagger接口(interface)从Java转换为Kotlin时遇到一些问题

如果没有@Provides注释方法,就无法提供[Dagger / MissingBinding] java.util.Map。

这是我的界面

   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 {```}


最佳答案

Kotlin中的Map在其值类型(public interface Map<K, out V>)上是协变(variance),而Java中的Map不是。您的功能将被翻译成

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

但 Dagger 提供的正是Map<String, CommandHandler>。因此,我们需要使用@JvmSuppressWildcards抑制通配符
commandRegistry: Map<String, @JvmSuppressWildcards CommandHandler>

Calling Kotlin from Java - variant-generics

07-24 09:38
查看更多