3

私はこのようないくつかのタイプを持っています

// a value that is aware of its key type (K)
Bar<K>
// something that deals with such values and keys
Foo<V extends Bar<K>, K>

Guice で使用できるように Foo を再作成するにはどうすればよいでしょうか? 私が立ち往生しているビットは、K を Bar から Foo の 2 番目のパラメーター化された型に相互参照する方法です。

たとえば、

WildcardType kType = Types.subtypeOf(Object.class);
WildcardType barType = 
   Types.subtypeOf(Types.newParameterizedType(Bar.class, pipeKey));
ParameterizedType fooType = 
   Types.newParameterizedType(Foo.class, pipelineableType, pipeKey);

基本的には、これは間違っているようです。

Foo<V extends Bar<? extends Object>, ? extends Object> 

これは次と同じではありません:

Foo<V extends Bar<K>, K>

後者の場合と同様に、K が一貫した型であることはわかっています。

何か案は?

乾杯

マット

4

2 に答える 2

4

Binderの JavaDoc から:

Guice は現在、ジェネリック型をバインドまたは注入できません。たとえば、Set<E>すべての型パラメーターを完全に指定する必要があります。

とがバインドされFooたときのバインドを作成できます。複数のタイプのキーのバインドを作成する必要がある場合は、これらのバインドを簡単にするメソッドを作成できます。これを行う 1 つの方法は、モジュールで次のようなメソッドを作成することです。KVFoo

<K, V extends Bar<K>> AnnotatedBindingBuilder<Foo<V, K>> bind(Class<K> keyType,
    Class<V> barType) {
  ParameterizedType bType = Types.newParameterizedType(Bar.class, keyType);
  ParameterizedType fType = Types.newParameterizedType(Foo.class, barType,
      keyType);

  @SuppressWarnings("unchecked")
  TypeLiteral<Foo<V, K>> typeLiteral =
      (TypeLiteral<Foo<V, K>>) TypeLiteral.get(fType);

  return bind(typeLiteral);
}

次に、これらのクラスがある場合:

class StringValue implements Bar<String> {
  ...
}

class StringValueProcessor implements Foo<StringValue, String> {
  ...
}

次のようなバインディングを作成できます。

bind(String.class, StringValue.class).to(StringValueProcessor.class);

...Guice が次のようにクラスに注入できるようにします。

static class Target {
  private final Foo<StringValue, String> foo;

  @Inject
  public Target(Foo<StringValue, String> foo) {
    this.foo = foo;
  }
}
于 2009-07-13T17:44:02.903 に答える