Dagger 2与Kotlin的多绑定问题

49

我在dagger 2模块中有以下代码片段

@Singleton
@Provides
@ElementsIntoSet
fun providesQueries(foo: Foo): Set<Foo>{
    val queries = LinkedHashSet<Foo>()
    queries.add(foo)
    return queries
}
我尝试以这种方式进行注入
@Inject lateinit var foo: Set<Foo>

但是 Dagger 显示了一个错误,说没有使用 @Provides 或 @Produces 方法无法提供 java.util.Set。

我在 Java 中做了同样的事情,它可以工作。有人知道为什么会失败吗?


你使用哪个注解处理器? - azizbekian
我使用 kapt。我在 build.gradle 文件中有以下行:kapt "com.google.dagger:dagger-compiler:$dagger_version" kapt { generateStubs = true } - Borja
比较Java生成的类和Kotlin生成的类,查看差异。显然,生成的类缺少@Produces。 - azizbekian
2
不,问题在于kapt在转换过程中失败并添加了<? extends Foo>,而dagger不知道如何处理。我正在尝试将此模块作为Java的解决方法。 - Borja
1个回答

108

正如 Kotlin 的 参考文档 中所描述的:

为了使 Kotlin API 在 Java 中可用,我们会将协变定义的 Box(或者逆变定义的 Foo<? super Bar>)作为参数出现时,生成 Box<? extends Super> 形式的 Box<Super>

如果你想避免这种情况,可以使用 @JvmSuppressWildcards。具体方法如下:

@Inject lateinit var foo: Set<@JvmSuppressWildcards Foo>

4
MutableSet<> 可以被使用。 - Borja
22
耶稣基督,浪费了两天时间!为什么这么痛苦...谢谢!如果有人像我一样苦于多重绑定Map,它几乎是相同的技巧。例如:class MviViewModelFactory @Inject constructor(private val providers: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory { - Ghedeon
1
感谢您的答复,我想要补充一些重要的内容,如果您使用特定的限定符,您必须在注释中添加 "field": "@field:MyQualifier"。如果您使用 Dagger 2.25.2 及以上版本,则不需要这样做,据我所知。 - ultraon
@JvmSuppressWildcards ... 这对于刚接触Dagger的人来说真是太可怕了 :D - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接