【发布时间】:2017-05-29 19:15:44
【问题描述】:
我正在尝试使用带有 @Inject 注释的 Guice 在另一个类(比如 ClassB)中注入一个通用类型的类(比如 ClassA)。被注入的类的代码如下所示:
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;
}
}
ClassB的代码如下:
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>>(){});
}
}
但是,当应用程序启动时,它会给出以下错误:
ERROR [2017-01-14 19:54:00,646] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting
! com.google.inject.CreationException: Unable to create injector, see the following errors:
!
! 1) Could not find a suitable constructor in java.lang.Class. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
! at java.lang.Class.class(Class.java:119)
任何有关如何解决此问题的意见都会非常有帮助。提前致谢。
【问题讨论】:
-
您为什么要尝试将
Class<T>注入某些东西?你知道模块中的类型不是重点吗? -
我想注入它,因为我想知道在运行时注入的类的类型。
-
这似乎违背了面向对象编程的观点。而且所有类都有
.getClass方法,这还不够吗? -
在上述场景中你将如何使用
.getClass方法?我想知道:) -
我不想将此作为答案发布,因为我很可能不理解您,但我指的是
public ClassA(Dependency1 dependency) { this.data = dependency.getClass(); /* etc. */ }
标签: java generics dependency-injection guice inject