如何包装Google Guice的Injector方法?

时间:2012-12-24 17:36:19

标签: java generics dependency-injection guice

我正在编写一个API,它将Guice用于其所有DI,并希望隐藏API开发人员的所有Guice“内容”。我有以下内容:

public class MyAppModule extends AbstractModule {
    @Override
    public void configure(Binder binder) {
        // Omitted for brevity...
        // For instance, binds interface type Animal to impl type Dog, etc.
    }
}

public class MyInjector {
    public abstract<?> inject(Class<?> clazz) {
        MyAppModule module = new MyAppModule();
        Injector injector = Guice.createInjector(module);

        return injector.getInstance(clazz);
    }
}

// So that API developers can just use Animal references and Guice will
// automatically inject instances of Dog
MyInjector injector = new MyInjector();
Animal animal = injector.inject(Animal.class); // <-- Guice returns a Dog instance

问题在于我的MyInjector#inject(Class<?>)方法。按原样编写,我收到编译器错误:

Multiple markers at this line
- Return type for the method is missing
- Syntax error on token "?", invalid TypeParameter

根据Guice docsInjector#getInstance会返回abstract<T>。如果可能的话,我想避免使用泛型以及明确的类型转换,以便为我的API开发人员简化操作。我有什么选择吗?如果是这样,他们是什么?如果没有,为什么?提前谢谢。

2 个答案:

答案 0 :(得分:5)

请勿使用通配符?使用T

之类的内容

另外,抽象方法不能有实现,所以你需要删除它(你覆盖了方法)

public <T> T inject(Class<T> clazz) {
    MyAppModule module = new MyAppModule();
    Injector injector = Guice.createInjector(module);

    return injector.getInstance(clazz);
}

答案 1 :(得分:2)

你应该使用类似的东西:

public <T> T inject(Class<T> clazz);

使用T代替?时,您可以返回T类型的对象

顺便说一下,这与Injector的作用相同:

public abstract T getInstance (Class<T> type)

注意:在您的代码中,您尝试实现抽象方法。您应该删除abstract关键字,否则您将收到语法错误。抽象方法不能包含实现(这在子类中完成)。