我有一组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,即将单个具体实现绑定到具有不同通用参数的单个接口?
答案 0 :(得分:2)
您可以通过创建表示绑定目标的TypeLite来实现此目的,可能涉及原始类型。
您将在此问题中看到如何执行此操作的示例: Reconstructing generic types at runtime with Guice via Types and TypeLiterals
基本上你需要的是构建每个处理程序的密钥&lt;&gt;你想绑定。
然后你可以这样说:
bindHandler(Bar.class, Baz.class);
将会:
TypeLiteral<ConcreteFoo<Bar, Baz>>
TypeLiteral<Foo<Bar, Baz>>
另外我认为在你的例子中,ConcreteHandler应该实现Handler [?]