【发布时间】:2012-04-26 10:28:13
【问题描述】:
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 的意见。恐怕我的选址有点短,因此看不到这种方法的缺陷。
【问题讨论】:
-
我不太明白泛型类如何“在适当键入时”提供非泛型接口的实现。是否编译?你能举个例子吗?
-
也许我把这个例子简单化了。我会更新的。
-
@axtavt 我希望这个问题现在更清楚了。
-
我有点困惑。对于第二个和第三个示例,您的意思是使用
bind(new TypeLiteral<MyGenericInterface<T>>(){})...而不是bind(MyGenericInterface<T>.class)...?正如您在问题顶部所说的那样,C<T>.class是没有意义的。那么,您的问题只是“我应该绑定到泛型类吗?我应该绑定到非泛型类型类吗?” -
@AndrewMcNamee 你是对的,我犯了一个错误。我的问题是您已经猜到“我应该绑定到泛型类吗?我应该绑定到非泛型类型类吗?
标签: java dependency-injection guice