为什么此代码使用 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 修复,这就是我认为你的问题所在。
的列表
拜托,有人能帮我弄清楚为什么下面的代码可以用 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 修复,这就是我认为你的问题所在。
的列表