【发布时间】:2015-12-09 10:28:44
【问题描述】:
我想重写泛型类型绑定,但总是遇到相同的“No implementation was bound”错误。
我正在使用 roboguice 3。
这是我使用的代码示例:
public interface IParser<I, O> {}
public class Parser1 implements IParser<String, String> {
IParser<String, String> mParser;
@Inject
public Parser1(IParser<String, String> parser) {
mParser = parser;
}
}
public class Parser2 extends Parser1 {
@Inject
public Parser2(IParser<String, String> parser) {
super(parser);
}
}
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1>() {});
}
}
这是我创建的注射器:
RoboGuice.getOrCreateBaseApplicationInjector(this,
RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this),
Modules.override(new MyModule()).with(new AbstractModule() {
@Override
protected void configure() {
bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser2>() {});
}
})
);
如果我不尝试覆盖它(仅用户 Parser1),一切都很好,当我使用提供程序覆盖标准对象时,它也可以正常工作,但不能使用 TypeLiteral。
我的错误是:
com.google.inject.CreationException: Unable to create injector, see the following errors:
1) No implementation for IParser<String, String> was bound.
我做错了什么?
谢谢。
【问题讨论】:
-
有人知道吗? Aurélien 需要提供更多信息吗?
-
我无法在 Guice 4 下重现这种行为。我会注意到存在循环依赖关系,Guice 使用代理类 shim 来满足这种依赖关系。 Roboguice 会在某处禁用代理吗?
-
旁注:你永远不需要
new TypeLiteral<ASimpleType>() {},你可以使用ASimpleType.class
标签: java android generics guice