Google のガイダンスはnew TypeLiteral<C<T>>() {}
、使用できないという事実を克服するために使用しますC<T>.class
。
現在は、以下に共通しています。
bind(new TypeLiteral<C<T>>() {}).to(MyCSubclassTypedToT.class);
ただし、別のシナリオを想像してみてください。注入したい汎用インターフェースがあり、実装は汎用クラスによって提供されます。
Guice を使用すると、次のように実行できます。
bind(new TypeLiteral<MyGenericInterface<T>>() {}).to(new TypeLiteral<MyGenericClass<T>>() {});
これを行う別の方法は、次のように MyGenericClass を拡張することです。
MyTypedClass extends MyGenericClass<T>
次に、次のようにバインドします。
bind(MyGenericInterface<T>>() {}).to(MyTypedClass.class);
MyGenericInterface が (種類は異なりますが) 頻繁に注入され、注入するたびに MyGenericClass を使用する場合、後者のアプローチでは過度に冗長なコードが作成されます。したがって、私は前者を使用することに傾いています。
Guice バインディングの to 句での TypeLiteral の使用について、他の人の意見を聞きたいと思っています。残念ながら、私は少しサイトが不足しているため、このアプローチの落とし穴がわかりません。