【问题标题】:Guice injecting a generic listGuice 注入一个通用列表
【发布时间】:2013-08-26 14:47:31
【问题描述】:

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

我有一个 MainView,它接受我想要显示的 ContentPanel(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 中?

【问题讨论】:

    标签: java swing list generics guice


    【解决方案1】:

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

    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) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多