guice FactoryModuleBuilder().implements() 是可选的吗?

Is guice FactoryModuleBuilder().implements() optional?

class TestClass {
    @Inject
    public TestClass(String arg1, @Assisted String arg2) {
        System.out.printf("TestClass(%s, %s)\n", arg1, arg2);
    }
}


interface TestFactory {
    TestClass makeTestClass(String extraArg);
}

class Main {
    @Inject
    public TestFactory factory;

    public static void main(String[] args) {
        Injector i = Guice.createInjector(
            new AbstractModule() { @Override protected void configure() {
                bind(String.class).toInstance("any string");
                install(new FactoryModuleBuilder().build(TestFactory.class));
            }}
        );

        Main m = i.getInstance(Main.class);

    m.factory.makeTestClass("assisted");
    }
}

此代码可以正常工作并打印 "TestClass(any string, assisted)"

但是根据文档,我必须调用

install(new FactoryModuleBuilder()
    .implement(TestClassInterface.class, TestClass.class)
    .build(TestFactory.class));

什么时候以及为什么我真的必须使用 implement()?仅何时进行命名绑定?

当工厂方法的 return 类型与您希望 Guice 实例化的类型不同时,您需要使用 .implement()。如果您的工厂方法 return 是接口类型,通常会发生这种情况。您使用 .implement() 告诉 Guice 它应该创建的具体 class 类型。