Google guice 用来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 的意见。恐怕我的选址可能有点短,因此看不到这种方法的缺陷。