java - Guice 注入(inject)通用列表

标签 java swing list generics guice

我想注入(inject)各种对象的列表,这些对象以其通用类型进行区分。

我有一个 MainView,它接受我想要显示的 ContentPanels(Jpanel 的子类型)列表。

所以我有

@Inject
MainView(List<ContentPanel<?>> contentPanel){
   ...
}

内容面板的通用类型有所不同,因此有一个用于书籍,一个用于电影等。

我尝试用

绑定(bind)它们
bind(new TypeLiteral<AbstractContentPanel<Book>>(){})
        .to(new TypeLiteral<BookContentPanel<Book>>(){})
        .in(Singleton.class);

bind(new TypeLiteral<AbstractContentPanel<Movie>>(){})
            .to(new TypeLiteral<BookContentPanel<Movie>>(){})
            .in(Singleton.class);

但是我如何制作它们的列表并将它们注入(inject)到我的 MainView 中?

最佳答案

如果您想将所有绑定(bind)注入(inject)到一个列表中,那么您不能这样做。如果你想注入(inject)一个列表,你应该直接绑定(bind)它,像这样:

bind(new TypeLiteral<List<String>>() {})
  .toInstance(new ArrayList<String>());

但在这种情况下,您的列表必须事先已知(或通过 Provider 提供)。

如果您想通过序列访问绑定(bind),则必须使用 multibinding extension 。在这种情况下,您的代码可能如下所示:

Multibinder<ContentPanel<?>> multibinder = Multibinder.newSetBinder(binder(), new TypeLiteral<ContentPanel<?>>() {});
multibinder.addBinding().to(YourContentPanelImpl1.class);
multibinder.addBinding().to(YourContentPanelImpl2.class);
// and so on

然后你可以注入(inject)一个Set:

@Inject
MainView(Set<ContentPanel<?>> contents) {
    ...
}

关于java - Guice 注入(inject)通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446908/

相关文章:

java - 如何从 jtextarea 中清除文本,然后继续 append 其他文本(使用相同的按钮)?

python - 通过匹配字典值来查找列表中字典的定义键的值

c# - 由于具体类和接口(interface)没有匹配 IEnumerable<T> 和 List<T> 的返回类型而导致的错误

java - 如何在 Hibernate 中创建条件查询?

java - 正则表达式查找第一个下划线之前和之后的所有字符,然后确保它们相同

Java Swing 应用程序,对话框检查范围内的数字

Java 读取和保存 GUI 元素

r - 如何将循环的结果存储到变量中?在R中

java - SMTP 客户端使用 HELO 命令停止

java - Path2D -- .contain() 不起作用