Create a new multibinder alternate for Set<? extends T> #1366
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is a simple linked binding to the original multibinder set. This is
safe because 'Set<? extends T>' is assignable from 'Set'.
This is useful for projects integrating Guice and Kotlin. In Kotlin there
are different types for read-only vs. read-write Sets. When declaring a
read-only Set, the bytecode includes a wildcard.
In particular, this Kotlin:
is equivalent to this Java:
Using Kotlin with Guice multibindings is quite annoying because the binding
to
Set<Runnable>
is typically provided, butSet<? extends Runnable>
isneeded.
The typical Kotlin workaround is also ugly:
With this fix, Guice multibindings and Guice should just work.
I expect this may be backwards-incompatible with a very small number of Kotlin
applications that implement a different workaround to the above problem:
I don't expect backwards incompatibility with Java programs. In such programs
the behavior change will result in a fast failure (injector fails to create)
which is easy to diagnose and fix.
Closes: #1282