我正在编写一个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 docs,Injector#getInstance
会返回abstract<T>
。如果可能的话,我想避免使用泛型以及明确的类型转换,以便为我的API开发人员简化操作。我有什么选择吗?如果是这样,他们是什么?如果没有,为什么?提前谢谢。
答案 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关键字,否则您将收到语法错误。抽象方法不能包含实现(这在子类中完成)。