如何在下面的Guice绑定代码中抽象Option类型,用Option
的泛型参数替换?
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;
}
答案 0 :(得分:2)
感谢Google网上论坛上的Stuart McCulloch回复:
^新的TypeLiteral&lt; ...&gt;(){}匿名类技巧仅在以下情况下有效 type参数在编译时是已知的。
如果需要在运行时构建泛型类型,可以使用 com.google.inject.util.Types实用程序类,例如:
final Key<Set<T>> multibinderKey =
Key.get( Types.setOf( superClass ), annotation );
为了正确构建,我按如下方式对其进行了修改:
final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);
所以完整的通用方法是:
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;
}
答案 1 :(得分:1)
java.util.Set<T> cannot be used as a key; It is not fully specified.
我认为Guice Key
不支持使用泛型 - 你只能有一些完全指定的东西(即没有未绑定的类型参数)。