Из JavaDoc для Binder :
Guice в настоящее время не может связывать или вводить
универсальный тип, такой как Set<E>
все
параметры типа должны быть полностью
указано.
Вы можете создавать привязки для Foo
, когда K
и V
связаны.
Если вам нужно сделать привязки для Foo
для ключей более одного типа, вы можете создать метод, который облегчит выполнение этих привязок. Один из способов сделать это - создать такой метод в вашем модуле:
<K, V extends Bar<K>> AnnotatedBindingBuilder<Foo<V, K>> bind(Class<K> keyType,
Class<V> barType) {
ParameterizedType bType = Types.newParameterizedType(Bar.class, keyType);
ParameterizedType fType = Types.newParameterizedType(Foo.class, barType,
keyType);
@SuppressWarnings("unchecked")
TypeLiteral<Foo<V, K>> typeLiteral =
(TypeLiteral<Foo<V, K>>) TypeLiteral.get(fType);
return bind(typeLiteral);
}
Тогда, если у вас есть эти классы:
class StringValue implements Bar<String> {
...
}
class StringValueProcessor implements Foo<StringValue, String> {
...
}
Вы можете создать привязку следующим образом:
bind(String.class, StringValue.class).to(StringValueProcessor.class);
... чтобы Guice мог внедрить в класс, подобный этому:
static class Target {
private final Foo<StringValue, String> foo;
@Inject
public Target(Foo<StringValue, String> foo) {
this.foo = foo;
}
}