2009-07-08 9 views
3

Guice fournit un moyen de trouver toutes les liaisons pour un type donné (Injector#findBindingsByType) et fournit également un TypeLiteral class à partir duquel il semble possible de construire un type générique. Ce que je voudrais faire est de trouver toutes les liaisons pour un type qui est paramétré par un type générique mais je n'arrive pas à comprendre comment le faire. Un regard sur le src Guice suggère que je pourrais aboyer le mauvais arbre, mais je me suis dit que je demande autour de toute façon ... Ainsi, par exemple donné un typeGuice SPI: recherche des liaisons par types génériques

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

et quelques liaisons comme

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

alors je veux être en mesure de découvrir à la fois des liaisons avec quelque chose comme

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

Toutes les idées?

Vive Matt

Répondre

3

Malheureusement, il n'y a pas hors-the-box API qui vous dira si un TypeLiteral est cessible d'une autre. Vous aurez besoin de faire une boucle old-school avec un tas de chèques hideuses. Quelque chose comme ceci brut:

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

Bien sûr, il serait beaucoup plus agréable de faire quelque chose en utilisant une API off-the-shelf. Je souhaiterais une contribution à Guice qui implémente et teste TypeLiteral.isAssignableFrom (TypeLiteral). Contactez la liste de nos utilisateurs pour faire du bénévolat!

+0

merci pour le pointeur, j'ai une version assez simple (basée sur ce qui précède) fonctionnant qui correspond à mes besoins immédiats mais je vais essayer de faire un cas plus général qui traite de quelques autres situations et le poster à la liste . – Matt