gpt4 book ai didi

java - 对于泛型,lambda 中的错误返回类型

转载 作者:行者123 更新时间:2023-11-29 08:31:45 25 4
gpt4 key购买 nike

拥有这个泛型代码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com