2

インターフェース -

public interface Add {
    public int add(int a, int b)
}

実装 1 -

class MartianAdd implements Add 
public int add(int a, int b) {
    return -a+b;
}
}

実装 2-

public class SimpleAdd implements Add {
public SimpleAdd() {}
public int add(int a, int b) {
    return a + b
}
}


class Bindings extends AbstractModule {
protected void configure() {
    bind(Add).annotatedWith(Names.named('Earth')).to(SimpleAdd)
    bind(Add).annotatedWith(Names.named('Mars')).to(MartianAdd)
}
}

メインクラス -

class Test {
public static void main(String[] args) {
    Injector injector = Guice.createInjector(new Bindings())
    @Named('Mars') Add a = injector.getInstance(Add)
    print a.class
    print a.add(5, 8)
}
}

例外 -

Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for in.ksharma.Add was bound.
  while locating in.ksharma.Add

Guice がバインディングをロードしないのはなぜですか?

4

1 に答える 1

2

これが問題だと思います:

@Named('Mars') Add a = injector.getInstance(Add)

のインスタンスを要求しているだけですAdd。結果を割り当てている変数に@Named注釈があるという事実は、Guice とは無関係です。適切な名前バインディングを持つ適切Injector.getInstance(Key)なクラスのキーを使用する必要があると思います。

Add add = injector.getInstance(Key.get(Add, Names.named('Mars')))
于 2013-08-16T09:20:42.520 に答える