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>

如何重新创建 Foo 以便您可以在 Guice 中使用它?我坚持的一点是如何将 K 从 Bar 交叉引用到 Foo 的第二个参数化类型。

例如,

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>必须完全指定所有类型参数。

您可以为何FooKV被绑定创建绑定。如果您需要为Foo不止一种类型的键进行绑定,则可以创建一种方法来更轻松地进行这些绑定。一种方法是在你的模块中创建一个这样的方法:

<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 回答
0

Guice 的工厂无法构建TypeVariable实例。您需要根据需要直接实现此接口。

请注意,Guice 不允许绑定不完全限定的类型。例如,您可以绑定 aMap<String, Integer>但不能绑定 a Map<K, V>

于 2009-07-13T05:57:49.283 回答