Frage

Guice bietet eine Möglichkeit, alle Bindungen für einen bestimmten Typ zu finden ( Injector # findBindingsByType ) und es stellt auch ein TypeLiteral Klasse , aus denen es möglich, eine Wildcard-Typ zu konstruieren scheint. Was ich möchte, ist zu tun, alle Bindungen für eine Art zu finden, die von einem Wildcard-Typ parametriert ist, aber ich kann nicht herausfinden, wie es zu tun. Ein Blick auf dem guice src schlägt, ich könnte den Holzweg, aber ich dachte, ich würde auf jeden Fall fragen, um ... so zum Beispiel eine Art gegeben

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

und einige Bindungen wie

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

dann will ich mit etwas beiden Bindungen entdecken können, wie

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

Irgendwelche Ideen?

Prost Matt

War es hilfreich?

Lösung

Leider gibt es keinen out-of-the-box-API, die Ihnen sagen, ob man TypeLiteral von einem anderen zugeordnet werden kann. Sie benötigen eine Old-School-Schleife mit einem Bündel von abscheulichen Instanceof Kontrollen zu tun. Etwas grob wie folgt aus:

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

Natürlich wäre es viel schöner sein, etwas mit einem off-the-shelf-API zu tun. Ich würde einen Beitrag zur Guice begrüßen, dass Geräte und Tests TypeLiteral.isAssignableFrom (TypeLiteral). Kontaktieren Sie unsere Benutzer-Liste freiwillig!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top