为什么匕首图在 java 中有效,但在 Kotlin 中,当我提供时它说缺少提供?

Why the dagger graph works works in java but in Kotlin it says missing Provides when I have provided?

我在将 Dagger 接口从 java 转换为 Kotlin

时遇到了一些问题

我得到 [Dagger/MissingBinding] java.util.Map cannot be provided without an @Provides-annotated method.

这是我的界面

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


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