簡體   English   中英

通用類型的Guice實例綁定

[英]Guice instance binding for generic type

我希望我的模塊將Parent的子類綁定到我創建的實例。

public class MyModule<T extends Parent> implements AbstractModule {
  T myAwesomeInstance;
  MyModule(String[] args, Class<T extends Parent> clazz) {
    myAwesomeInstance = clazz.newInstance(); // catching exceptions and stuff ...
    ArgumentParser.configure(myAwesomeInstance, args);
  }

  @Override
  void configure() {
      bind(new TypeLiteral<T>(){}).toInstance(myAwesomeInstance);
  }
}

這段代碼可以很好地編譯,但是當我嘗試運行時,Guice會抱怨“ T不能用作鍵;它沒有完全指定”。 如何將泛型類綁定到模塊創建的該類的實例?

我的解決方案與建議的副本不同。 我需要保存類對象,以便將類正確綁定到我選擇的實例。

public class MyModule<T extends Parent> implements AbstractModule {
  T myAwesomeInstance;
  Class<T> _clazz;

  MyModule(String[] args, Class<T extends Parent> clazz) {
    myAwesomeInstance = clazz.newInstance(); // catching exceptions and stuff ...
    _clazz = clazz;
    ArgumentParser.configure(myAwesomeInstance, args);
  }

  @Override
  void configure() {
      bind(TypeLiteral.get(_clazz)).toInstance(myAwesomeInstance);
  }
}

無需使用TypeLiteral ,您可以直接使用Key (這使您有機會根據需要添加注釋。)

最好將構造實例推遲到單例時間,而不是將模塊實例化。 例如,您可以這樣做:

public final class MyModule<T extends Parent> extends AbstractModule {
  private final Key<T> key;
  private final Provider<T> provider;

  public MyModule(final Class<T> clazz, final String[] args) {
    this.key = Key.get(clazz); // Or add an annotation if you feel like it
    this.provider = new Provider<T>() {
      @Override public T get() {
        try {
          T instance = clazz.newInstance();
          // etc.
        } catch (ReflectiveOperationException ex) {
          // throw a RuntimeException here
        }
      }
    };
  }

  @Override protected void configure() {
    bind(key).toProvider(provider).in(Singleton.class);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM