泛型情况下 lambda 中的返回类型错误

Nas*_*LEK 1 java generics lambda compiler-errors java-8

拥有这个泛型代码

\n\n
static final <T> List<Class<? extends T>> findSubClasses(Class<T> clz, String packageName){\n    ClassPathScanningCandidateComponentProvider provider =\n                new ClassPathScanningCandidateComponentProvider(false);\n    provider.addIncludeFilter(new AssignableTypeFilter(clz));\n    Set<BeanDefinition> beanDefinitions = provider.findCandidateComponents(packageName);\n    List<Class<? extends T>> subClasses = beanDefinitions.stream().map(b->mapToClass(b, clz)).collect(Collectors.toList());\n        return subClasses;\n}\n\nprivate static final <T> Class<? extends T> mapToClass(BeanDefinition beanDefinition, Class<T> clz) {\n   String className = beanDefinition.getBeanClassName();\n   try {\n       return (Class<? extends T>) Class.forName(className);\n   } catch (ClassNotFoundException e) {\n       log.error("Failed to load the scanned class {}", className, e);\n   }\n   return null;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在b->mapToClass(b, clz)

\n\n
Bad\xc2\xa0return\xc2\xa0type\xc2\xa0in\xc2\xa0lambda\xc2\xa0expression:\xc2\xa0Class<capture\xc2\xa0of\xc2\xa0?\xc2\xa0extends\xc2\xa0T>\xc2\xa0cannot\xc2\xa0be\xc2\xa0converted\xc2\xa0to\xc2\xa0Class<Object>\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何解决这个问题?

\n

Did*_*r L 5

这是编译器IntelliJ 无法正确推断操作的返回类型的情况map()

您可以通过简单地提供新的流项目类型来帮助它:Class<? extends T>如下所示:

List<Class<? extends T>> subClasses = beanDefinitions.stream()
        .<Class<? extends T>>map(b-> mapToClass(b, clz))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

请注意,这似乎只是 IntelliJ 中的一个错误,因为 javac 似乎很乐意编译它(如预期的那样)。

mapToClass()作为侧节点,您可以通过如下编写来避免未经检查的强制转换:

return Class.forName(className).asSubclass(clz);
Run Code Online (Sandbox Code Playgroud)