Java 如何在Guice中将单个接口绑定到多个类?

Java 如何在Guice中将单个接口绑定到多个类?,java,dependency-injection,guice,Java,Dependency Injection,Guice,想要为例如绑定一个接口到多个类 bind(interface1.class).to(classAbc.class); bind(interface1.class).to(classDef.class); bind(interface1.class).to(classGhi.class); 尝试过这个,但似乎不起作用: baseClass obj1; obj1.add(new classAbc); obj2.add(new classDef); bind(interface1.class).

想要为例如绑定一个接口到多个类

bind(interface1.class).to(classAbc.class);
bind(interface1.class).to(classDef.class);
bind(interface1.class).to(classGhi.class);
尝试过这个,但似乎不起作用:

baseClass obj1;

obj1.add(new classAbc);
obj2.add(new classDef);

bind(interface1.class).toInstance(obj1);

你看过《多活页夹》吗? 这是一个直接来自

公共类SnacksModule扩展了AbstractModule{
受保护的void configure(){
多活页夹多活页夹
=Multibinder.newSetBinder(binder(),Snack.class);
multibinder.addBinding().toInstance(新Twix());
multibinder.addBinding().toProvider(SnickersProvider.class);
multibinder.addBinding().to(Skittles.class);
}
}

如果您想做这样的事情:

baseClass obj1;

obj1.add(new classAbc);
obj2.add(new classDef);

bind(interface1.class).toInstance(obj1);
您可以,但只有当您的
基类
是复合模式时(其中对象还可以充当其他对象的容器)。否则,您需要在另一个容器中提供备选方案,如列表:

List<Interface1> interfaceList = new ArrayList<>();

interfaceList.add(new classAbc());
interfaceList.add(new classDef());

bind(new TypeLiteral<List<Interface1>>() {}).toInstance(interfaceList);

是的,我看过Multibinder,但现在还不能用。但是,在我当前的实现中,哪里出了问题?还有其他方法吗?如果你有
@injectfoo(interface1obj){}
会是
classAbc
吗<代码>类别定义?你怎么知道?嘿,谢谢你的建议,我将尝试这两种解决方案。正如你提到的,我无法通过原始提供程序(无类型参数)将提供程序转换为提供程序。方法的正确返回类型是
List
List<Interface1> interfaceList = new ArrayList<>();

interfaceList.add(new classAbc());
interfaceList.add(new classDef());

bind(new TypeLiteral<List<Interface1>>() {}).toInstance(interfaceList);
public class YourModule extends AbstractModule {
  @Override public void configure() {}

  @Provides Set<Interface1> createSet(ClassAbc abc, ClassDef def) {
    return ImmutableSet.of(abc, def);
  }

  // Provider<ClassAbc> can't usually be cast to Provider<Interface1>
  @SuppressWarnings 
  @Provides Set<Provider<Interface1>> createProviderSet(
      Provider<ClassAbc> abc, Provider<ClassDef> def) {
    return ImmutableSet.of(
        (Provider<Interface1>) abc,
        (Provider<Interface1>) def);
  }
}