Java 如何编写通用Guice绑定函数?
如何在下面的Guice绑定代码中抽象选项类型,用泛型参数替换Java 如何编写通用Guice绑定函数?,java,generics,guice,Java,Generics,Guice,如何在下面的Guice绑定代码中抽象选项类型,用泛型参数替换选项 ArrayList<Class<? extends Option>> options = new ArrayList<Class<? extends Option>>(); bindMultibinder(annotation, options); public Key<Set<Option>> bindMultibinder( Named annot
选项
ArrayList<Class<? extends Option>> options =
new ArrayList<Class<? extends Option>>();
bindMultibinder(annotation, options);
public Key<Set<Option>> bindMultibinder(
Named annotation, ArrayList<Class<? extends Option>> contents) {
Multibinder<Option> options =
Multibinder.newSetBinder(binder(), Option.class, annotation);
for (Class<? extends Option> option : contents) {
options.addBinding().to(option);
}
final Key<Set<Option>> multibinderKey =
Key.get(new TypeLiteral<Set<Option>>(){}, annotation);
return multibinderKey;
}
ArrayList
java.util.Set不能用作键;它没有完全指定。
告诉我GuiceKey
不支持使用泛型-您只能拥有完全指定的内容(即没有未绑定的类型参数)。感谢Google Groups上的回答:
^新的TypeLiteral(){}匿名类技巧仅在以下情况下有效
类型参数在编译时已知
如果需要在运行时生成泛型类型,可以使用
com.google.inject.util.Types实用程序类,例如:
final Key multibinderKey=
get(Types.setOf(超类),注释);
为了使其正确构建,我对其进行了如下修改:
final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);
final Key multibinderKey=Key.get(Types.setOf(超类),注释);
因此,完整的通用方法是:
public <T> Key<?> bindMultibinder(
Named annotation, Class<T> superClass, ArrayList<Class<? extends T>> contents) {
Multibinder<T> options =
Multibinder.newSetBinder(binder(), superClass, annotation);
for (Class<? extends T> t : contents) {
options.addBinding().to(t);
}
final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);
return multibinderKey;
}
公钥绑定多绑定器(
命名注释、类超类、ArrayList“泛型等效”与您的第一个示例完全不同,因为您从未提供编译器可以知道T的值的方法。抱歉@DwB,但我认为情况并非如此。编译器可以并且确实正确地推断T的正确类型。我猜想它是从bindMultibinder met中的类超类参数推断出来的hod.也许您没有看到该参数?感谢您解释错误;这很有意义。我打赌我需要使用GuiceTypeLiteral
来完成此操作。如果我修复了它,我会用答案进行更新。
public <T> Key<?> bindMultibinder(
Named annotation, Class<T> superClass, ArrayList<Class<? extends T>> contents) {
Multibinder<T> options =
Multibinder.newSetBinder(binder(), superClass, annotation);
for (Class<? extends T> t : contents) {
options.addBinding().to(t);
}
final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);
return multibinderKey;
}