3

我正在编写一个使用 Guice 作为其所有 DI 的 API,并希望对 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 文档Injector#getInstance返回一个abstract<T>. 如果可能的话,我想避免泛型以及显式类型转换,以使我的 API 开发人员更简单。我在这里有什么选择吗?如果是这样,它们是什么?如果不是,为什么?提前致谢。

4

2 回答 2

5

不要使用通配符?使用类似的东西T

此外,抽象方法不能有实现,因此您需要将其删除(您正在覆盖该方法)

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

    return injector.getInstance(clazz);
}
于 2012-12-24T17:38:48.760 回答
2

你应该使用类似的东西:

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

当使用T而不是?你可以返回一个类型的对象T

顺便说一句,这是一样的Injector

public abstract T getInstance (Class<T> type)

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

于 2012-12-24T17:39:54.870 回答