当前位置: 首页 > 知识库问答 >
问题:

如何将单个实现绑定到Guice中的多个通用接口?

白哲茂
2023-03-14

我有一组15-20个类,它们依赖于一个用绑定类型参数实现泛型接口的类。界面如下所示:

interface Handler<F extends Foo, T extends Foo> {
    T handleFoo(String methodName, F myFoo);
}

处理程序的单个实现使用反射来处理Foo的所有特殊情况,因为它们都“相似但不同”。

class ConcreteHandler<Foo, Foo> implements Handler<Foo, Foo> {
    T handleFoo(String methodName, F foo) {
        // do your thing
    }
}

我希望能够在其协作者中以类型安全的方式使用此类,例如:

@Inject ACollaborator(Handler<Bar, Baz> barHandler) {...}

其中,条形图和Baz都扩展到Foo。不幸的是,Guice抱怨处理程序

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

我还尝试了以下操作,这会导致编译器错误,因为ConcreteHandler不是Handler的子类

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

我有这么多这样的协作器对象,以至于我不热衷于为每个类型组合实现Handler,并为它们放入20个单独的绑定语句。

我该如何实现我在Guice上所做的尝试,即用不同的泛型参数将单个具体实现绑定到单个接口?

共有1个答案

孙德宇
2023-03-14

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

在这个问题中,您将看到一个如何做到这一点的示例:通过类型和类型文字在运行时用Guice重构泛型类型

基本上,您需要的是构建每个处理程序的Key

然后你可以这样说:

bindHandler(Bar.class, Baz.class);

这将:

  1. 创建类型文字

此外,我认为在您的示例中ConcreteHandler应该实现Handler[?]

 类似资料:
  • 我有一组验证器类,它们都扩展了一个公共抽象类,它们都具有相同的构造函数 我想要Guice的能力 < li >知道如何构造所有这些验证器,将相同的数据源注入所有这些验证器中 < li >使用多绑定器将所有验证器注入到一个类中 通过一些谷歌搜索,看起来我可以使用,但问题是如果我想这样做,我必须为每个验证器创建一个工厂,这是一个巨大的样板。因为他们都有相同的构造函数,我觉得一定有更好的方法。我的对象是在

  • 我有一个关于在Guice中绑定的问题。 Guice不会知道我想要IMYInterface的哪个实现。我是否可以在这个阶段指定注释来有选择地说:我想要MyClass2的实现? 多谢

  • 我已经通过Guice侦听器为一组特定的请求设置了一个过滤器,即*/dispatch。 在这个筛选器中,我希望根据请求URI更改每个请求中类型BaseService(包含一个方法的接口)的绑定。例如,如果URI是/hello/dispatch,我希望BaseService绑定到HelloServiceImpl;如果URI是/bye/dispatch,我希望绑定到ByeServiceImpl。两者都实

  • 看来Guice正在尝试使用不同于预期的创建方法。你知道怎么解决这个问题吗?如有任何指示,将不胜感激! 谢谢!

  • 本文向大家介绍Laravel 将接口绑定到实现,包括了Laravel 将接口绑定到实现的使用技巧和注意事项,需要的朋友参考一下 示例 在服务提供者register方法中,我们可以将接口绑定到实现: 从现在开始,每次应用程序需要的实例时UserRepositoryInterface,Laravel都会自动注入的新实例EloquentUserRepository:            

  • 我有6个输入框,每个输入框有4位数字。输入4位数字后,光标将自动转到下一个输入框。所有这些都是强制性的。 现在,可以在“onChange”事件中将自动聚焦设置为下一个文本框。但如何将这6个输入框的值绑定到表单上的一个字段。我有办法吗?