【问题标题】:Why this code compiles with jdk8u45 and above but not with jdk8u25?为什么这段代码可以用 jdk8u45 及更高版本编译,但不能用 jdk8u25 编译?
【发布时间】:2016-05-21 21:10:55
【问题描述】:

请,有人可以帮我弄清楚为什么以下代码可以使用 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>>))

【问题讨论】:

  • 可能是 8u25 中的一个错误。这个错误对我来说没有多大意义。 (我认为参数不匹配是错误的,并且由于某种原因它也推断出TreeMap&lt;Object,Subtask&gt;。)
  • 是关于 Oracle JDK 的吗?
  • 我找不到任何错误报告,但我不明白为什么不应该编译。这很可能是一个错误。
  • 我以前见过这个问题。我认为它已在 8u40 中解决。如果重新打开,我可以给出正确的答案,但我认为 javac 中的错误是:bugs.java.com/view_bug.do?bug_id=8033483
  • @dkatzel 看起来就是答案。如果您发布它,我将接受它作为答案。谢谢。

标签: java java-8 javac


【解决方案1】:

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

这里是all bug fixes in 8u40的列表

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2012-07-06
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多