Nas*_*LEK 1 java generics lambda compiler-errors java-8
拥有这个泛型代码
\n\nstatic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我在b->mapToClass(b, clz)
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>\nRun Code Online (Sandbox Code Playgroud)\n\n如何解决这个问题?
\n这是编译器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)
| 归档时间: |
|
| 查看次数: |
1109 次 |
| 最近记录: |