2009-07-08 38 views
3

Guice提供了查找给定类型的所有绑定(Injector#findBindingsByType)的方法,它还提供了一个TypeLiteral class,从中可以构建通配符类型。我想要做的是找到所有通过通配符类型参数化的类型的绑定,但我无法弄清楚如何去做。一看吉斯SRC暗示我可能会找错了树,但我想我会问问周围反正...所以例如给出一种类型,Guice SPI:通过通配符类型查找绑定

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

任何想法都发现绑定?

干杯 马特

回答

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来做某些事情会更好。我希望贡献Guice来实现和测试TypeLiteral.isAssignableFrom(TypeLiteral)。联系我们的用户名单志愿者!

+0

感谢您的指针,我有一个非常简单的版本(基于上述)工作,适合我的直接需求,但我会尝试做一个更一般的情况下,处理一些更多的情况,并将其张贴到列表。 – Matt 2009-07-10 23:31:24