web-dev-qa-db-ja.com

KotlinによるDagger 2マルチバインディング

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メソッドなしでDaggerがJava.util.Setを提供できないことを示すエラーを示します。

私はJava=でも同じことをしましたが、うまくいきました。なぜ失敗したのか誰かが知っていますか?

32
Borja

Kotlinで説明されているように 参照

Kotlin APIをJavaで動作させるには、共変的に定義されたBoxの場合はBox<Super>としてBox<? extends Super>を生成します(または、反変的に定義されたFooの場合はFoo<? super Bar>)パラメータとして表示される場合。

次のように、@JvmSuppressWildcardsを使用して回避できます。

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