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