【发布时间】:2013-09-20 21:19:56
【问题描述】:
我有一组 15-20 个类,它们依赖于一个实现具有绑定类型参数的泛型接口的类。界面如下:
interface Handler<F extends Foo, T extends Foo> {
T handleFoo(String methodName, F myFoo);
}
还有一个 Handler 的实现,它使用反射来处理 Foo 的所有特殊情况,因为它们都是“相似但不同的”。
class ConcreteHandler<Foo, Foo> implements Handler<Foo, Foo> {
T handleFoo(String methodName, F foo) {
// do your thing
}
}
我希望能够在其协作者中以类型安全的方式使用此类,例如:
@Inject ACollaborator(Handler<Bar, Baz> barHandler) {...}
其中Bar 和Baz 都扩展Foo。不幸的是,当我在我的模块中尝试这个时,Guice 抱怨 Handler<Bar, Baz> 未绑定:
bind(new TypeLiteral<Handler<? extends Foo, ? extends Foo>>() {}).to(ConcreteHandler.class);
我还尝试了以下方法,这会导致编译器错误,因为ConcreteHandler 不是Handler<Bar, Baz> 的子类:
bind(new TypeLiteral<Handler<Bar, Baz>>() {}).to(ConcreteHandler.class);
我有很多这样的 Collaborator 对象,因此我并不热衷于为每种类型组合实现 Handler,并为它们放入 20 个单独的绑定语句。
我如何使用 Guice 完成我正在尝试的事情,即将单个具体实现绑定到具有不同泛型参数的单个接口?
【问题讨论】:
-
您的意思是
bind(new TypeLiteral<Handler<? extends Foo, ? extends Foo>>() {}).to(ConcreteHandler.class);吗? -
是的,谢谢你指出这一点,@PaulBellora。