将 类 的映射绑定到 guice 模块内的实例

Binding a map of classes to instances inside guice module

我目前正在尝试添加由 Map<? extends CustomModule, CustomModule>(来自额外的自定义模块系统)组成的映射的条目作为 guice 模块中的绑定。

到目前为止我的代码如下所示:

manager.getRegistry().forEach(new BiConsumer<Class<? extends CustomModule>, ModuleRegistry.Entry>() {
    @Override
    public void accept(Class<? extends CustomModule> moduleClass, ModuleRegistry.Entry entry) {
        bind(moduleClass).to(entry.getModule()); // getModule() returns the instance which implements moduleClass
    }
});

Guice 遗憾地需要直接 class 而不是通配符(“?extends”)。 既然我已经得到了 "bindings",还有其他方法可以将它们添加到注射器吗?

提前致谢!

所以在尝试了各种其他可能的方法之后,我终于找到了一个可行的方法。 由于最初的问题是 Guice 需要一个 "capture" 的东西(在这种情况下 "capture of ? extends Module instance",基本上意味着某个东西是某个模块的实例)并且失败了,我不得不转换我已经知道的东西模块 class 到它的原始类型,像这样:

final Class moduleClass = (Class) aClass;
final Binding binding = injector.getExistingBinding(Key.get(moduleClass));
if (binding == null) {
    bind(moduleClass).toInstance(entry.getModule());
}

我还必须在我的案例中添加空检查,但它还包括如何将你的未知 class 转换为 guice 的 "Key" 助手。