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

残念ながら、あるTypeLiteralが別のTypeLiteralから割り当て可能かどうかを通知するすぐに使用できるAPIはありません。恐ろしい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 に答える