Благодаря Стюарту МакКаллоху в группах 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;
}