我想注入(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/