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

标签 java generics lambda compiler-errors java-8

拥有这个泛型代码

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/

相关文章:

c# - 重构 OrderBy 表达式

java - 在我的例子中,我有什么选择来防止 Java 中的重复代码

java - 如何设置BottomNavigationView的颜色?

arrays - 有什么有效的方法可以将 TArray<string> 转换为 TStringDynArray?

python - 如何使用 Lambda 在 AD 中创建用户和组

.net - 如何传递 System.Linq.LambdaExpression?

java - 递归地将 jars 包含到类路径中

java - 使用 JRE 1.8 或更高版本运行 Android Studio

c# - 新实例的泛型类型实现了什么?

c# - Expression<Func<in T, bool>> 或 Expression<Func<TBase,bool>> 到 Expression<Func<T,bool>> 转换器