Как я могу написать общую функцию привязки Guice? - PullRequest
2 голосов
/ 29 декабря 2011

Как я могу абстрагировать тип Option в приведенном ниже коде привязки Guice, подставив универсальный параметр для 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;
}

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Благодаря Стюарту МакКаллоху в группах Google за ответы:

^ новый трюк анонимного класса TypeLiteral <...> () {} работает только тогда, когда параметр типаизвестен во время компиляции.

Если вам нужно создавать универсальные типы во время выполнения, вы можете использовать служебный класс 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 голос
/ 29 декабря 2011

java.util.Set<T> cannot be used as a key; It is not fully specified.

Говорит мне, что Guice Key не поддерживает использование Generics - вы можете указать только что-то полностью (т.е. без параметров несвязанного типа).

...