为啥匕首图可以在 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 中却说在我提供时缺少提供?的主要内容,如果未能解决你的问题,请参考以下文章

<button> 在 chrome 中工作,但在 Firefox 中不工作 - 为啥?

为啥这个 jQuery AJAX PUT 可以在 Chrome 中工作,但不能在 FF 中工作

为啥 Thymeleaf 代码在 HTML 的 head 部分不起作用但在 body 中工作正常

为啥我的 Access VBA 在 Excel 中添加小计在一个数据库中工作,但在另一个数据库中出现错误 1004?

为啥 JDBC 代码在 Java 中可以工作,但在 Android 中返回 null?

为啥 setLandingPageType("billing") 在沙盒中工作,但在 PAYPAL PHP REST API SDK WebProfile 中的实时版本中不工作