拥有这个泛型代码
static final <T> List<Class<? extends T>> findSubClasses(Class<T> clz, String packageName){
ClassPathScanningCandidateComponentProvider provider =
new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(clz));
Set<BeanDefinition> beanDefinitions = provider.findCandidateComponents(packageName);
List<Class<? extends T>> subClasses = beanDefinitions.stream().map(b->mapToClass(b, clz)).collect(Collectors.toList());
return subClasses;
}
private static final <T> Class<? extends T> mapToClass(BeanDefinition beanDefinition, Class<T> clz) {
String className = beanDefinition.getBeanClassName();
try {
return (Class<? extends T>) Class.forName(className);
} catch (ClassNotFoundException e) {
log.error("Failed to load the scanned class {}", className, e);
}
return null;
}
我在 b->mapToClass(b, clz)
上有这个错误消息
Bad return type in lambda expression: Class<capture of ? extends T> cannot be converted to Class<Object>
如何解决这个问题?
最佳答案
在这种情况下,编译器 IntelliJ 无法正确推断 map()
的返回类型操作。
您可以通过简单地提供新的流项目类型来帮助它:Class<? extends T>
像这样:
List<Class<? extends T>> subClasses = beanDefinitions.stream()
.<Class<? extends T>>map(b-> mapToClass(b, clz))
.collect(Collectors.toList());
请注意,它似乎只是 IntelliJ 中的一个错误,因为 javac 似乎可以愉快地编译它(如预期的那样)。
作为侧节点,可以避免mapToClass()
中未经检查的转换写成如下:
return Class.forName(className).asSubclass(clz);
关于java - 对于泛型,lambda 中的错误返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47471761/