[英]Guice injecting a generic list
我想注入一個與它們的泛型類型不同的各種對象的列表。
我有一個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中呢?
如果要將所有綁定注入列表中,則不能這樣做。 如果要插入列表,則應將其直接綁定,如下所示:
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) {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.