为啥匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供?

Posted

技术标签:

【中文标题】为啥匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供?【英文标题】:Why the dagger graph works works in java but in Kotlin it says missing Provides when I have provided?为什么匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供? 【发布时间】:2020-08-19 06:17:04 【问题描述】:

在将 dagger 接口从 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 ```


【问题讨论】:

尝试使用commandRegistry: Map&lt;String, @JvmSuppressWildcards CommandHandler&gt;,你也不需要@JvmStatic(我假设你使用的是dagger 2.26或更高版本) @IR42 它有效,但我不确定我们为什么需要 JvmSuppressWildcards 。请写下答案,我会投票给你的答案。 【参考方案1】:

Kotlin 中的Map 在其值类型 (public interface Map&lt;K, out V&gt;) 上是协变的 (variance),但 Java 中的 Map 不是。你的函数将被翻译成

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

但 dagger 正好提供 Map&lt;String, CommandHandler&gt;。所以我们需要用@JvmSuppressWildcards抑制通配符

commandRegistry: Map<String, @JvmSuppressWildcards CommandHandler>

Calling Kotlin from Java - variant-generics

【讨论】:

以上是关于为啥匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供?的主要内容,如果未能解决你的问题,请参考以下文章