为啥匕首图可以在 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<String, @JvmSuppressWildcards CommandHandler>
,你也不需要@JvmStatic
(我假设你使用的是dagger 2.26或更高版本)
@IR42 它有效,但我不确定我们为什么需要 JvmSuppressWildcards 。请写下答案,我会投票给你的答案。
【参考方案1】:
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
【讨论】:
以上是关于为啥匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供?的主要内容,如果未能解决你的问题,请参考以下文章