将Dagger接口(interface)从Java转换为Kotlin时遇到一些问题
如果没有@Provides注释方法,就无法提供[Dagger / MissingBinding] java.util.Map。
这是我的界面
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接口(interface)
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>
Calling Kotlin from Java - variant-generics