NetBeans IDE编译Java8代码报错:推断类型不符合上限,求解答
问题原因与解决办法
这事儿其实是Java 8早期版本的javac编译器类型推断bug搞的鬼,不同IDE用的编译器不一样,所以结果有差异:
为什么会报错?
你用的NetBeans默认用Oracle官方的javac编译器,而JDK 1.8.0_144属于Java 8的早期版本,它的类型推断在处理嵌套收集器的时候有局限。具体来说:
Collectors.minBy(Comparator.naturalOrder())这里,早期javac没法自动推断出泛型类型是Character,导致它认为返回的Optional类型和外层mapping期望的类型不匹配,于是抛出“inferred type does not conform to upper bound(s)”错误。
为什么Eclipse能正常编译?
Eclipse用的是自家的ECJ编译器(Eclipse Compiler for Java),它的类型推断逻辑比同期的javac更智能、更宽松,能正确识别嵌套收集器里的泛型类型,所以不会报错。
解决办法(二选一)
1. 显式指定泛型类型
给Comparator.naturalOrder()加上明确的泛型声明,帮javac理清类型:
public static void main(String[] args) { Stream<String> ohMy = Stream.of("lions", "tigers", "bears"); Map<Integer, Optional<Character>> map = ohMy.collect( Collectors.groupingBy( String::length, Collectors.mapping(s -> s.charAt(0), Collectors.minBy(Comparator.<Character>naturalOrder())))); System.out.println(map); }
2. 升级JDK版本
Oracle在Java 8u20及以后的版本中修复了这个类型推断的bug,如果你把JDK升级到较新的Java 8版本(比如u202),原代码就能直接编译通过了。
内容的提问来源于stack exchange,提问作者hoapham
相关产品推荐
相关产品推荐

