从 Google Guice 获取通配符实例
Get a wildcard instance from Google Guice
嗨,我正在试验 Google Guice 5.x
。我的 class 定义为:
public class Foo<T> {
// some logic here
}
它正在其他 class 中使用,例如:
public class Bar {
private final Foo<Chocolate> provider;
public Bar(Foo<Chocolate> _choco) {
this.provider = _choco;
}
}
public abstract class BaseZoo { // in some other package in a different jar
private final Injector injector = Guice.createInjector(new MyAppModule());
private Foo<?> provider;
public String doSomething() {
if (provider == null)
this.provider = this.injector.getInstance(Foo.class);
// some other code logic.
}
}
现在,在我的模块文件中 (MyAppModule
) 我将 Foo 定义为:
@Inject
@Provides
@Singleton
public Foo<Chocolate> getFoo(FooDependency fooDep) {
return new Foo<>(fooDep);
}
现在,当我 运行 我的代码时,Google Guice 能够找到 Foo<Chocolate>
的实例,但无法找到 Foo<?>
的实例。
有没有办法配置 Google Guice 以使用 Foo<Chocolate>
的实例解析 Foo<?>
?
绑定类型:
@Inject
@Provides
@Singleton
public Foo<?> getFoo(FooDependency fooDep) { ... }
如果您仍想绑定 Foo<Chocolate>
,请在问题中使用 @Provides
方法,还要绑定 Foo<?>
到它,您可以在配置方法中这样做:
bind(new Key<Foo<?>>() {}).to(new Key<Foo<Chocolate>>() {});
或者,使用提供者方法:
@Provides
Foo<?> provideWildcardFoo(Foo<Chocolate> chocolateFoo) {
return chocolateFoo;
}
嗨,我正在试验 Google Guice 5.x
。我的 class 定义为:
public class Foo<T> {
// some logic here
}
它正在其他 class 中使用,例如:
public class Bar {
private final Foo<Chocolate> provider;
public Bar(Foo<Chocolate> _choco) {
this.provider = _choco;
}
}
public abstract class BaseZoo { // in some other package in a different jar
private final Injector injector = Guice.createInjector(new MyAppModule());
private Foo<?> provider;
public String doSomething() {
if (provider == null)
this.provider = this.injector.getInstance(Foo.class);
// some other code logic.
}
}
现在,在我的模块文件中 (MyAppModule
) 我将 Foo 定义为:
@Inject
@Provides
@Singleton
public Foo<Chocolate> getFoo(FooDependency fooDep) {
return new Foo<>(fooDep);
}
现在,当我 运行 我的代码时,Google Guice 能够找到 Foo<Chocolate>
的实例,但无法找到 Foo<?>
的实例。
有没有办法配置 Google Guice 以使用 Foo<Chocolate>
的实例解析 Foo<?>
?
绑定类型:
@Inject
@Provides
@Singleton
public Foo<?> getFoo(FooDependency fooDep) { ... }
如果您仍想绑定 Foo<Chocolate>
,请在问题中使用 @Provides
方法,还要绑定 Foo<?>
到它,您可以在配置方法中这样做:
bind(new Key<Foo<?>>() {}).to(new Key<Foo<Chocolate>>() {});
或者,使用提供者方法:
@Provides
Foo<?> provideWildcardFoo(Foo<Chocolate> chocolateFoo) {
return chocolateFoo;
}