多くの場合、型パラメーターは の便利な部分です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
自分で安全にキャストできます。警告が醜い場合は、静的メソッドでキャストをラップできます。