Dagger 2与Kotlin的多重绑定

Bor*_*rja 30 android kotlin dagger-2

我的匕首2模块中有以下片段

@Singleton
@Provides
@ElementsIntoSet
fun providesQueries(foo: Foo): Set<Foo>{
    val queries = LinkedHashSet<Foo>()
    queries.add(foo)
    return queries
}
Run Code Online (Sandbox Code Playgroud)

我试着以这种方式注入

@Inject lateinit var foo: Set<Foo>
Run Code Online (Sandbox Code Playgroud)

但是匕首显示一个错误,表示Dagger无法在没有@Provides或@Produces方法的情况下提供java.util.Set.

我在java中也做了同样的工作.有人知道为什么会失败吗?

小智 71

正如它在Kotlin 参考文献中所描述的那样

为了使Kotlin API在Java中工作,我们生Box<Super>成为 当它作为参数出现时的Box<? extends Super>协变定义Box(或Foo<? super Bar>用于逆变定义的Foo).

您可以使用@JvmSuppressWildcards它来避免它,如下所示:

@Inject lateinit var foo: Set<@JvmSuppressWildcards Foo>
Run Code Online (Sandbox Code Playgroud)

  • 耶稣基督,浪费了2天!为什么这么痛苦......谢谢!如果像我这样的人正在努力解决多绑定`Map​​`问题,那几乎就是同样的伎俩.例如:`类MviViewModelFactory @Inject构造函数(私有val提供者:Map <Class <out ViewModel>,@ JvmSuppressWildcards Provider <ViewModel >>):ViewModelProvider.Factory {` (9认同)
  • 也可以使用MutableSet <> (3认同)