Java 用Guice注入泛型
我正在尝试迁移一个小项目,用Guice替换一些工厂(这是我的第一次Guice试用版)。然而,在尝试注入泛型时,我被卡住了。我设法提取了一个包含两个类和一个模块的小玩具示例:Java 用Guice注入泛型,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在尝试迁移一个小项目,用Guice替换一些工厂(这是我的第一次Guice试用版)。然而,在尝试注入泛型时,我被卡住了。我设法提取了一个包含两个类和一个模块的小玩具示例: import com.google.inject.Inject; public class Console<T> { private final StringOutput<T> out; @Inject public Console(StringOutput<T> out)
import com.google.inject.Inject;
public class Console<T> {
private final StringOutput<T> out;
@Inject
public Console(StringOutput<T> out) {
this.out = out;
}
public void print(T t) {
System.out.println(out.converter(t));
}
}
public class StringOutput<T> {
public String converter(T t) {
return t.toString();
}
}
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(StringOutput.class);
bind(Console.class);
}
public static void main(String[] args) {
Injector injector = Guice.createInjector( new MyModule() );
StringOutput<Integer> out = injector.getInstance(StringOutput.class);
System.out.println( out.converter(12) );
Console<Double> cons = injector.getInstance(Console.class);
cons.print(123.0);
}
}
但是没有成功(相同的错误消息)
有人能给我解释一下错误信息并给我一些提示吗?谢谢。我认为您看到的具体问题可能是因为
bind(Console.class)
语句。它还应该使用TypeLiteral
。或者,您可以只绑定这两种类型,JIT绑定将为您解决这一问题,因为这里涉及的两种类型都是具体的类
此外,您还应使用以下工具检索控制台
:
Console<Double> cons =
injector.getInstance(Key.get(new TypeLiteral<Console<Double>>(){}));
当然,正如我上面所说的,在本例中,您可以跳过该选项,使用基于
TypeLiteral
的键
从注入器检索控制台
,绑定将是隐式的。谢谢。我不知道如何将TypeLiteral绑定到控制台,因为我无法创建没有StringOutput实例的控制台实例。你能告诉我细节吗?我刚试过。只有在我同时定义类型literals和y使用键来获取实例时,它才起作用。所以我不能使绑定显式。我不知道你说的不能使绑定显式是什么意思。如果将每个模块的bind语句都放在模块中,那么它是显式的。另外,我应该注意到,一般情况下,应用程序中应该只有一个对injector.getInstance()的调用,它应该检索一些根应用程序对象供您启动。其他的一切都应该由@Inject注释的构造函数来完成。所以在实践中,您通常不需要使用injector.getInstance(Key.get(new-TypeLiteral…)。@ColinD在Guice模块中绑定时也可以不指定具体类型t吗?我知道这很旧,但我在这里也遇到了同样的问题:我正在努力解决这个问题。有人能提供指导吗?
bind(new TypeLiteral<StringOutput<Double>>() {}).toInstance(new StringOutput<Double>());
Console<Double> cons =
injector.getInstance(Key.get(new TypeLiteral<Console<Double>>(){}));
bind(new TypeLiteral<Console<Double>>(){});