Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用Guice注入泛型_Java_Dependency Injection_Guice - Fatal编程技术网

Java 用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)

我正在尝试迁移一个小项目,用Guice替换一些工厂(这是我的第一次Guice试用版)。然而,在尝试注入泛型时,我被卡住了。我设法提取了一个包含两个类和一个模块的小玩具示例:

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>>(){});