Java 如何编写通用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

如何在下面的Guice绑定代码中抽象选项类型,用泛型参数替换
选项

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不能用作键;它没有完全指定。

告诉我Guice
Key
不支持使用泛型-您只能拥有完全指定的内容(即没有未绑定的类型参数)。

感谢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.也许您没有看到该参数?感谢您解释错误;这很有意义。我打赌我需要使用Guice
TypeLiteral
来完成此操作。如果我修复了它,我会用答案进行更新。
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;
}