Java 注入泛型类型为@InjectGuice的类时出错

Java 注入泛型类型为@InjectGuice的类时出错,java,generics,dependency-injection,guice,inject,Java,Generics,Dependency Injection,Guice,Inject,我正在尝试使用带有@injectannotation的Guice将泛型类型的类(比如ClassA)注入另一个类(比如ClassB)。正在注入的类的代码如下所示: public interface InterfaceA<T> { } public class ClassA<T> implements InterfaceA<T> { private final Class<T> data; private Dependency1 d

我正在尝试使用带有@injectannotation的Guice将泛型类型的类(比如ClassA)注入另一个类(比如ClassB)。正在注入的类的代码如下所示:

public interface InterfaceA<T> {

}

public class ClassA<T> implements InterfaceA<T> {
    private final Class<T> data;
    private Dependency1 dependency1;

    @Inject
    public ClassA(Class<T> data, Dependency1 dependency1) {
        this.data = data;
        this.dependency1 = dependency1;
    }

}

关于如何解决这一问题的任何意见都将非常有用。提前感谢。

您不能以声明的方式执行此操作。您必须使用提供程序方法:

public class MyModule extends AbstractModule {
  @Override protected void configure() {}

  @Provides InterfaceA<Entity1> provideInterfaceAEntity1(Dependency1 dep) {
    return new ClassA<Entity1>(Entity1.class, dep);
  }
}
公共类MyModule扩展了AbstractModule{
@重写受保护的void configure(){}
@提供接口A提供接口实体1(Dependency1 dep){
返回新的ClassA(Entity1.class,dep);
}
}
这是唯一的方法,因为您无法在
ClassA
中自动注入
Class


你需要在你的
模块中为你想要与
接口结合的每个
实体
使用这样的方法a
我终于找到了解决方案。这里,我不是在ClassA的构造函数中注入
类数据
,而是注入
TypeLiteral-literal
,并使用它的
getRawType()
方法从TypeLiteral读取类类型

ClassA的代码如下所示:

public class ClassB {
    private InterfaceA<Entity1> interfaceA;

    @Inject
    public ClassB(InterfaceA<Entity1> interfaceA) {
        this.interfaceA = interfaceA;
    }
}
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(new TypeLiteral<InterfaceA<Entity1>>(){}).to(new TypeLiteral<InterfaceA<Entity1>>(){});
    }
}
public class ClassA<T> implements InterfaceA<T> {
    private final Class<? super T> data;
    private Dependency1 dependency1;

    @Inject
    public ClassA(TypeLiteral<T> literal, Dependency1 dependency1) {
        this.data = literal.getRawType();
        this.dependency1 = dependency1;
    }
}
公共类ClassA实现了InterfaceA{

私有最终类感谢您的解决方案!但是,在这种情况下,我们将ClassA的所有依赖项移到该类之外,这似乎不是一种干净的方式。此外,我们在这里不使用Guice的@Inject功能,而是使用new()创建一个新对象。我找到了另一种方法。请查看我的解决方案。@user3375226使用
new
在Guice中是不被禁止的。使用
@Inject
甚至不是强制性的。此外,Guice建议构造函数使用
literal.getRawType()请求最终对象
,你打破了这个建议。我相信这个解决方案是最有效的。你为什么要尝试将
注入到某个东西中?你不知道模块中的类型吗?我想注入它是因为我想知道在运行时注入的类的类型。这似乎与OO编程的观点背道而驰。此外,所有类都有一个
.getClass
方法,这还不够?在上述场景中,您将如何使用
.getClass
方法?我想知道:)我不想将此作为答案发布,因为我很可能不理解您,但我指的是类似于
公共类a(Dependency1 dependency)的内容{this.data=dependency.getClass();/*etc.*/}
public class ClassA<T> implements InterfaceA<T> {
    private final Class<? super T> data;
    private Dependency1 dependency1;

    @Inject
    public ClassA(TypeLiteral<T> literal, Dependency1 dependency1) {
        this.data = literal.getRawType();
        this.dependency1 = dependency1;
    }
}