3

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))));

有任何想法吗?

干杯马特

4

1 回答 1

3

不幸的是,没有开箱即用的 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 做一些事情会更好。我欢迎对实现和测试 TypeLiteral.isAssignableFrom(TypeLiteral) 的 Guice 做出贡献。联系我们的用户列表来做志愿者!

于 2009-07-09T08:44:40.613 回答