0

我想注入一个不同对象的列表,这些对象与其通用类型不同。

我有一个 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?

4

1 回答 1

4

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

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

但在这种情况下,您的列表必须事先知道(或通过 a 提供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) {
    ...
}
于 2013-08-26T18:47:55.190 回答