簡體   English   中英

在Guice注入一家通用工廠

[英]Injecting a generic factory in Guice

以下代碼是在給定Foo<T>生成Bar<T>的工廠示例。 工廠不關心T是什么:對於任何類型T ,它可以從Foo<T>創建Bar<T> Foo<T>

import com.google.inject.*;
import com.google.inject.assistedinject.*;

class Foo<T> {
  public void flip(T x) { System.out.println("flip: " + x); }
}

interface Bar<T> {
  void flipflop(T x);
}

class BarImpl<T> implements Bar<T> {
  Foo<T> foo;

  @Inject
  BarImpl(Foo<T> foo) { this.foo = foo; }

  public void flipflop(T x) { foo.flip(x); System.out.println("flop: " + x); }
}

interface BarFactory {
  <T> Bar<T> create(Foo<T> f);
}

class Module extends AbstractModule {
  public void configure() {
    bind(BarFactory.class)
      .toProvider( 
          FactoryProvider.newFactory( BarFactory.class, BarImpl.class ) 
                   );
  }
}

public class GenericInject {
  public static void main(String[] args) {
    Injector injector = Guice.createInjector(new Module());

    Foo<Integer> foo = new Foo<Integer>();
    Bar<Integer> bar = injector.getInstance(BarFactory.class).create(foo);
    bar.flipflop(0);
  }
}

當我運行代碼時,我從Guice得到以下錯誤:

1) No implementation for BarFactory was bound.
  at Module.configure(GenericInject.java:38)

2) Bar<T> cannot be used as a key; It is not fully specified.

我可以在Guice文檔中找到泛型的唯一參考說明使用TypeLiteral 但是我沒有文字類型,我有一個與工廠無關的通用占位符。 有小費嗎?

一種選擇是手動編寫BarFactory樣板:

class BarImplFactory implements BarFactory {
  public <T> Bar<T> create(Foo<T> f) {
    return new BarImpl(f);
  }
}

綁定變成了

bind(BarFactory.class).to(BarImplFactory.class);

如果你認為guice是一個類似於spring的布線系統,那么連接一個通用實例並沒有多大意義。 您將特定實例連接到鍵,以便當另一個實例化類使用@Inject BarFactory標記某些內容時,您將獲得特定的已創建實例。

由於您的實現是通用的,因此您沒有提供足夠的信息來注入特定實例。 雖然我沒有使用factoryprovider,但我的假設是你需要將Barfactory綁定到一個完全參數化的實例,例如BarImpl<Concrete>而不是BarImpl)

順便說一句,因為你要綁定BarFactory.class,如果你想綁定多個實例,你將不得不以某種方式用它來改變它們,或者像(沒有檢查語法,但是)

bind(BarFactory.class).annotatedWith(Names.named("name1"))
      .toProvider( 

or by generics, bind(BarFactory<Concrete>).toProvider...

暫無
暫無

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

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