我想注入一个与其泛型类型不同的各种对象的列表。
我有一个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?
答案 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) {
...
}