为什么匕首图可以在Java中工作,但在Kotlin中却说我提供时缺少Provides?

问题描述 投票:0回答:1

在将匕首接口从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接口

public interface HubsCommandHandler {```}


java android kotlin dagger-2 dagger
1个回答
1
投票

Map在Kotlin中是其值类型(variance)的协变(public interface Map<K, out V>),但在Java中不是Map。您的函数将生成如下所示:

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

但是匕首恰好提供了Map<String, CommandHandler>。因此,我们需要使用@JvmSuppressWildcards

来抑制通配符
commandRegistry: Map<String, @JvmSuppressWildcards CommandHandler>

Calling Kotlin from Java - variant-generics

© www.soinside.com 2019 - 2024. All rights reserved.