【问题标题】: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 。请写下答案,我会投票给你的答案。

标签: java android kotlin dagger-2 dagger


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2023-04-06
    • 2015-03-17
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多