为什么此代码使用 jdk8u45 及更高版本编译但不使用 jdk8u25?

Why this code compiles with jdk8u45 and above but not with jdk8u25?

拜托,有人能帮我弄清楚为什么下面的代码可以用 jdk8u45 及更高版本编译但不能用 jdk8u25 编译吗? 我查看了 JDK 发行说明,但没有找到与该问题相关的任何内容,或者可能遗漏了它。

代码

public class Main {

    static class Param {
        final int id;

        Param(int id) {
            this.id = id;
        }
    }

    static class Subtask {
        final Param param;

        Subtask(Param param) {
            this.param = param;
        }
    }

    public static void main(String[] args) {
        List<? extends Param> params = IntStream.range(1, 100).mapToObj(Param::new).collect(Collectors.toList());
        NavigableMap<String, Subtask> map = params.stream()
                .collect(Collectors.toMap(p -> UUID.randomUUID().toString(), Subtask::new, (a, b) -> a, TreeMap::new));
    }
}

jdk8u25异常:

Error:(33, 17) java: no suitable method found for collect(java.util.stream.Collector<org.ka.Main.Param,capture#1 of ?,java.util.TreeMap<java.lang.String,org.ka.Main.Subtask>>)
    method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super capture#2 of ? extends org.ka.Main.Param>,java.util.function.BiConsumer<R,R>) is not applicable
      (cannot infer type-variable(s) R
        (actual and formal argument lists differ in length))
    method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super capture#2 of ? extends org.ka.Main.Param,A,R>) is not applicable
      (cannot infer type-variable(s) R,A,capture#3 of ?,T,K,U,M,K,V
        (argument mismatch; java.util.stream.Collector<capture#2 of ? extends org.ka.Main.Param,capture#4 of ?,java.util.TreeMap<java.lang.Object,org.ka.Main.Subtask>> cannot be converted to java.util.stream.Collector<? super capture#2 of ? extends org.ka.Main.Param,capture#4 of ?,java.util.TreeMap<java.lang.Object,org.ka.Main.Subtask>>))

我在类型推断方面遇到了类似的问题,它在 8u5 和 8u25 之间的某处中断并在 8u40 中得到修复。 8u40 中的错误修复列表有一些与 nested lambda bodies incorrectly ruling out some methods in overload resolution 有关的 javac 修复,这就是我认为你的问题所在。

这是all bug fixes in 8u40

的列表