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);
}
}