如何在Guice AbstractModule中使用@Provides方法绑定泛型类型?

时间:2016-07-07 23:55:23

标签: java guice

E.g。

public final class SomeModule<T> extends AbstractModule {
  private final Class<T> clazz;
  public SomeModule(Class<T> clazz) {
    this.clazz = clazz;
  }

  @Provides
  T getT(@ExternalAnnotation Any any) {
    Any payload = asset.get().getPayload();
    return payload.<T>unpack(clazz);
  }
}

这将导致错误:

T cannot be used as a key; It is not fully specified.

这里使用TypeLiteral和Key似乎都不合适,因为我希望返回类型仍然是T类型。思想?

1 个答案:

答案 0 :(得分:2)

对于类型擦除,Guice将没有足够的信息来自您的模块实例来确定您绑定的类型。

相反,接受一个类文字并使用它。此示例保留了泛型,但如果您的用例不需要它们,则可以删除它们。

// Warning: Untested. Please revise if needed.
public final class SomeModule<T> extends AbstractModule {
  private Class<T> t;

  public SomeModule(Class<T> t) {
    this.t = t;
  }

  @Override
  public void configure() {
    // Uses a class instance rather than reflection, so this is fine.
    bind(t).toProvider(new Provider<T>() {
      // ... do stuff
    });
  }
}

另见: