1

私はジェネリック型クラスを持っています。このクラスを注入しようとしていますが、機能していないようです。私が見つけた他の解決策は、モジュールに型をハードコーディングすることを推奨しているため、ジェネリックを持つという全体のポイントに反しています。

@Override
protected void configure() {

    this.bind(new TypeLiteral<IServiceClient<Object>>(){}).to(new TypeLiteral<ServiceClient<Object>>(){});



}

使用法

@Inject IServiceClient<Customer> customerServiceClient;

4

1 に答える 1

0

多くの場合、型パラメーターは の便利な部分ですKey(それ自体はTypeLiteralと バインディング アノテーションのみで構成されます)。Guice は、 と を 2 つの異なるバインディングとして扱いたいと考えているためIServiceClient<User>IServiceClient<Property>2 つの異なる実装で簡単に実現できます。MyService<Foo>あなたの場合は、 any の同じ実装クラスにバインドしたい、あまり具体的でないケースのようですFoo

Guice の根本は、キーからプロバイダーへのマップであるため、1 つのステートメントで広範囲のキーをバインドするのは簡単ではありません。もちろんIServiceProvider、サポートする予定のさまざまな型パラメーターをループして、それぞれを個別にバインドすることもできますが、それが「ジェネリックの全体に対する」解決策のようです。(私はそれが要点を過ぎていることに同意しませんが、パラメーターとして幅広いクラスをサポートしている場合、ループが少し扱いに​​くいことに同意します。)

いずれにせよ、ジェネリックは消去によって処理されるため、実装クラスを一度バインドし、クラスのコンストラクターでキャストすることをお勧めします。

class MyConsumer {
  IServiceProvider<Foo> fooServiceProvider;

  @SuppressWarnings("unchecked")
  @Inject
  MyConsumer(IServiceProvider<?> fooServiceProvider) {
    this.fooServiceProvider = (IServiceProvider<Foo>) fooServiceProvider;
  }
}

こうすることで、Guice は意図した型に関係なく同じ実装を反射的に探すので、IServiceProvider自分で安全にキャストできます。警告が醜い場合は、静的メソッドでキャストをラップできます。

于 2013-01-28T04:38:13.370 に答える