具有此泛型代码
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>怎么解决这个问题?
发布于 2017-11-24 11:38:33
您向这些方法提供的泛型信息是不相关的,即使您给它们取了相同的名称(T)。如果您想使它们有某种程度的关联,则需要在类级别上声明它们。
但在这种情况下,它将无法工作,因为您的方法是static;因此,例如:
public class YourClass<T> {
final 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 final Class<? extends T> mapToClass(BeanDefinition beanDefinition, Class<T> clz) {
String className = beanDefinition.getBeanClassName();
try {
return (Class<? extends T>) Class.forName(className);
} catch (ClassNotFoundException e) {
}
return null;
}
}编辑
实际上,作为Didier's points out,javac-8和javac-9可以很好地工作,因此根本不需要进行任何重构.
https://stackoverflow.com/questions/47471761
复制相似问题