我正在使用Google Guice IoC容器。我有两个包,一个包含接口,另一个包含这些接口的实现。
ClassFinder类返回包中的类列表。
当我尝试绑定接口到实现时,我收到以下编译错误:无法从到方法解析<java.lang.Class<capture<?>>
方法。< / p>
API指定可以作为参数Class,packageClass是Class。应该是什么问题?
public void autoMatch(String basePackageName)
{
String interfacesPackage = basePackageName + "." + interfacesPackageName;
String implementationPackage = basePackageName + "." + implementationPackageName;
List<Class<?>> interfaces = ClassFinder.find(interfacesPackage);
List<Class<?>> implementations = ClassFinder.find(implementationPackage);
for(Class<?> packageClass : implementations)
{
String name = packageClass.getSimpleName();
try
{
Class<?> foundInterface
= interfaces.stream()
.filter(packageInterface -> packageInterface.getSimpleName().equals(name + "Interface"))
.findFirst().get();
bind(foundInterface).to(packageClass);
}
catch (NoSuchElementException exception)
{
Log.error("IoC", "Could not match interface to implementation", exception);
}
}
}
修改
通过强制转换为(Class)来解决问题。找到该类,但绑定时会抛出java.lang.NullPointerException。
答案 0 :(得分:1)
通过不再使用ClassFinder查找类并使用Reflections库来修复此问题。
public void autoMatch(String basePackageName)
{
String interfacesPackage = basePackageName + "." + interfacesPackageName;
String implementationPackage = basePackageName + "." + implementationPackageName;
Reflections interfacesReflections = new Reflections(interfacesPackage);
Reflections implementationsReflections = new Reflections(implementationPackage);
Set<Class<? extends Object>> interfaces = interfacesReflections.getSubTypesOf(Object.class);
Set<Class<? extends Object>> implementations = implementationsReflections.getSubTypesOf(Object.class);
for(Class<?> packageClass : implementations)
{
String name = packageClass.getSimpleName();
try
{
Class<?> foundInterface
= interfaces.stream()
.filter(packageInterface -> packageInterface.getSimpleName().equals(name + "Interface"))
.findFirst().get();
bind(foundInterface).to((Class)packageClass);
}
catch (NoSuchElementException exception)
{
Log.error("IoC", "Could not match interface to implementation", exception);
}
}
}
答案 1 :(得分:1)
问题是你在编译时失去信息该类实现了接口。从编译器的角度来看,最终会得到两个不相关的Class<?>
对象,而Guice是用泛型编写的,没有方法可以将它们相互绑定。
未经测试:请考虑使用Class
代替Class<?>
,因此不使用泛型。
那就是说,我建议你手工编写20-30个绑定。使用依赖注入的想法是将接口与其实现分离,并且您的方法将在它们之间引入一个微妙的,难以调试的运行时依赖性,我认为这不是一件好事。