我有一组 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) {...}
whereBar
和Baz
both 延伸Foo
。Handler<Bar, Baz>
不幸的是,当我在我的模块中尝试这个时,Guice 抱怨说没有绑定:
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 的功能,即将单个具体实现绑定到具有不同泛型参数的单个接口?