Guice SPI: поиск привязок по типам подстановочных знаков

Guice предоставляет средства для поиска всех привязок для заданного типа (Injector#findBindingsByType), а также предоставляет класс TypeLiteral, из которого представляется возможным создать подстановочный тип. Я хотел бы найти все привязки для некоторого типа, который параметризован типом подстановочного знака, но я не могу понять, как это сделать. Взгляд на guice src предполагает, что я, возможно, лаю не по тому дереву, но я решил, что все равно поспрашиваю... так, например, учитывая тип

Foo<E extends Bar>
BarImplOne implements Bar
BarImplTwo implements Bar

и некоторые привязки, такие как

bind(new TypeLiteral<Foo<BarImplOne>>() {}).to(MyFooOne.class);
bind(new TypeLiteral<Foo<BarImplTwo>>() {}).to(MyFooTwo.class);

то я хочу иметь возможность обнаружить обе привязки с чем-то вроде

Injector.findBindingsByType(TypeLiteral.get(Types.newParameterizedType(Foo.class, Types.subtypeOf(Bar.class))));

Любые идеи?

Привет Мэтт


person Matt    schedule 08.07.2009    source источник


Ответы (1)


К сожалению, нет готового API, который сообщит вам, может ли один TypeLiteral назначаться другим. Вам нужно будет сделать цикл старой школы с кучей отвратительных проверок instanceof. Что-то такое грубое:

for (Map.Entry<Key<?>, Binding<?>> entry 
    : injector.getBindings().entrySet()) {
  Type type = entry.getKey().getTypeLiteral().getType();
  if (!(type instanceof ParameterizedType)) continue;

  ParameterizedType parameterized = (ParameterizedType) type;
  if (parameterizedType.getRawType() != Foo.class) continue;

  Type parameter = .getActualTypeArguments()[0]
  if (!(parameter instanceof Class)) continue;

  Class<?> parameterClass = (Class<?>) parameter;
  if (!Bar.class.isAssignableFrom(parameterClass)) continue;

  results.add(entry);
}

Конечно, было бы гораздо приятнее сделать что-то с помощью готового API. Я приветствовал бы вклад в Guice, который реализует и тестирует TypeLiteral.isAssignableFrom(TypeLiteral). Свяжитесь со списком наших пользователей, чтобы стать волонтером!

person Jesse Wilson    schedule 09.07.2009
comment
спасибо за указание, у меня есть довольно простая версия (на основе вышеизложенного), работающая, которая соответствует моим непосредственным потребностям, но я попытаюсь сделать более общий случай, который касается еще нескольких ситуаций, и опубликую его в список. - person Matt; 11.07.2009