42
votes

I have the following snippet in my dagger 2 module

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

I try to inject into in this way

@Inject lateinit var foo: Set<Foo>

But dagger shows an error which says that Dagger cannot provides java.util.Set without @Provides or @Produces method.

I did the same in java and it worked. Does somebody know why is it failing?

1
What annotation processor do you use?azizbekian
I use kapt. I have the following lines in my build.gradle. kapt "com.google.dagger:dagger-compiler:$dagger_version" kapt { generateStubs = true }Borja
Compare java generated classes and kotlin generated classes, see the diff. Obviously generated class misses @Produces.azizbekian
No, the problem is that kapt fails into the translation and adds <? extends Foo> and dagger does not know how to manage that. I'm trying to have this module in java as a workarround.Borja

1 Answers

94
votes

As it described in the Kotlin reference

To make Kotlin APIs work in Java we generate Box<Super> as Box<? extends Super> for covariantly defined Box (or Foo<? super Bar> for contravariantly defined Foo) when it appears as a parameter.

You can use @JvmSuppressWildcards for avoiding it, just as following:

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