Guice注入通用列表

时间:2013-08-26 14:47:32

标签: java swing list generics guice

我想注入一个与其泛型类型不同的各种对象的列表。

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

所以我有

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

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

我尝试用

绑定它们
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);

但是如何列出它们并将它们注入我的MainView?

1 个答案:

答案 0 :(得分:4)

如果要将所有绑定注入列表,则不能这样做。如果要注入列表,则应直接绑定它,如下所示:

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

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

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

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

然后你可以注入一个Set

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