【问题标题】:How do I bind a single implementation to multiple generified interfaces in Guice?如何将单个实现绑定到 Guice 中的多个通用接口?
【发布时间】: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) {...}

其中BarBaz 都扩展Foo。不幸的是,当我在我的模块中尝试这个时,Guice 抱怨 Handler&lt;Bar, Baz&gt; 未绑定:

bind(new TypeLiteral<Handler<? extends Foo, ? extends Foo>>() {}).to(ConcreteHandler.class);

我还尝试了以下方法,这会导致编译器错误,因为ConcreteHandler 不是Handler&lt;Bar, Baz&gt; 的子类:

bind(new TypeLiteral<Handler<Bar, Baz>>() {}).to(ConcreteHandler.class);

我有很多这样的 Collaborator 对象,因此我并不热衷于为每种类型组合实现 Handler,并为它们放入 20 个单独的绑定语句。

我如何使用 Guice 完成我正在尝试的事情,即将单个具体实现绑定到具有不同泛型参数的单个接口?

【问题讨论】:

  • 您的意思是bind(new TypeLiteral&lt;Handler&lt;? extends Foo, ? extends Foo&gt;&gt;() {}).to(ConcreteHandler.class); 吗?
  • 是的,谢谢你指出这一点,@PaulBellora。

标签: java generics guice


【解决方案1】:

您可以通过创建表示绑定目标的 TypeLiteral 来设法做到这一点,可能涉及到一个原始类型。

您将在此问题中看到如何执行此操作的示例: Reconstructing generic types at runtime with Guice via Types and TypeLiterals

基本上你需要的是构造你想要绑定的每个 Handler 的 Key。

然后你可以这样说:

bindHandler(Bar.class, Baz.class);

哪个会:

  1. 创建一个TypeLiteral&lt;ConcreteFoo&lt;Bar, Baz&gt;&gt;
  2. 创建一个TypeLiteral&lt;Foo&lt;Bar, Baz&gt;&gt;
  3. 将后者绑定到前者

另外我认为在你的例子中 ConcreteHandler 应该实现 Handler[?]

【讨论】:

  • 您对 ConcreteHandler 的 implements 子句的省略是正确的。谢谢。我会试一试您的建议并报告。
猜你喜欢
  • 1970-01-01
  • 2022-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多