为什么匕首图在 java 中有效,但在 Kotlin 中,当我提供时它说缺少提供?
Why the dagger graph works works in java but in Kotlin it says missing Provides when I have provided?
我在将 Dagger 接口从 java 转换为 Kotlin
时遇到了一些问题
我得到 [Dagger/MissingBinding] java.util.Map cannot be provided without an @Provides-annotated method.
这是我的界面
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 {```}
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>
我在将 Dagger 接口从 java 转换为 Kotlin
时遇到了一些问题我得到 [Dagger/MissingBinding] java.util.Map cannot be provided without an @Provides-annotated method.
这是我的界面
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 {```}
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>