【问题标题】:Google guice - multibinding + generics + assistedinjectGoogle guice - 多重绑定 + 泛型 + 辅助注入
【发布时间】:2011-11-26 16:08:53
【问题描述】:

我有以下课程:

public interface Factory<T extends MyParentClass> {
    public T create(String parameter);
}

public class FactoryImpl1 implements Factory<MyChildClass1> {
    public MyChildClass1 create(String parameter){
    ...
    }
}

public class FactoryImpl2 implements Factory<MyChildClass2> {
    public MyChildClass2 create(String parameter){
    ...
    }
}

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        MapBinder<String, Factory<MyParentClass>> factoryMap = MapBinder.newMapBinder(binder(), new TypeLiteral<String>() {}, new TypeLiteral<Factory<MyParentClass>>(){});
        factoryMap.addBinding("myKey1").to(FactoryImpl1.class);
        factoryMap.addBinding("myKey2").to(FactoryImpl2.class);
    }
}

我的模块中的语法不正确,我不知道如何配置。

事实上,我希望在我的工厂界面中为每一种可能的工厂提供一个工厂

提前感谢您的帮助。

【问题讨论】:

    标签: generics guice multibinding


    【解决方案1】:

    Factory&lt;MyParentClass&gt; 不是Factory&lt;MyChildClass1&gt; 的超类型,您需要指定通配符泛型(在这种情况下绑定或未绑定并不重要,因为您已在工厂定义中绑定它)。

    试试

    MapBinder<String, Factory<?>> factoryMap = MapBinder.newMapBinder(binder(), new TypeLiteral<String>(){}, new TypeLiteral<Factory<?>>(){});
    

    检查here 了解泛型之间的超类型关系。

    【讨论】:

    • 感谢 Geno 的解决方案,但我试图避免“演员”。可能吗 ?因为如果我使用您的解决方案,我需要进行显式转换: MyChildClass1 myChildClass1 = (MyChildClass1) factoryMap.get("myKey1").create("myParameter");当我将一个字符串键绑定到我的模块中的一个特殊实现时,我不想再次精确这个实现。
    • @Manu 如果您的代码知道具体的子类型,那么您就不需要地图活页夹。您可以直接注入特定的工厂。如果您的代码只看到 MyParentClass 并且不关心将接收哪个具体实现,则 MapBinder 很有用。
    猜你喜欢
    • 2018-09-21
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多