当前位置: 首页 > 知识库问答 >
问题:

为什么这个java8示例没有使用类型推断在Eclipse中编译?

穆彬郁
2023-03-14

我正在阅读新发布的Java 8在行动中,发现有一段从第5章粘贴的代码没有编译:

    List<Integer> numbers1 = Arrays.asList(1, 2, 3);
    List<Integer> numbers2 = Arrays.asList(3, 4);
    List<int[]> pairs =
    numbers1.stream()
    .flatMap((Integer i) -> numbers2.stream()
    .map(j -> new int[]{i, j})
    )
    .collect(toList());

Eclipse说:“类型不匹配:无法从< code >列表转换

在与作者在Github上给出的内容进行比较后,编译如下:

    List<Integer> numbers1 = Arrays.asList(1, 2, 3);
    List<Integer> numbers2 = Arrays.asList(3, 4);
    List<int[]> pairs =
    numbers1.stream()
    .flatMap((Integer i) -> numbers2.stream()
    .map((Integer j) -> new int[]{i, j})
    )
    .collect(toList());

唯一的变化是从“j”到“(整数j)”。

但是,第一个版本与第二个版本在Java8提供的语法糖中不是完全相同吗?为什么Java拒绝编译它?

谢谢

顺便说一句:

java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode)

共有1个答案

李胡媚
2023-03-14

首先,纠正你的术语:当你说语法糖时,你真正要问的是类型推断,即当被要求为内部lambda中的j推断类型时,编译器无法找到正确的类型。

第二,纠正数据:您引用的错误消息不是来自JDK编译器;他们来自Eclipse。

这只是一个Eclipse bug。参考编译器(< code>javac来自Oracle JDK)可以很好地处理您的第一个示例。

 类似资料:
  • 问题内容: 我在阅读新发布的Java 8 in Action,发现从第5章粘贴了一部分代码,但未编译: Eclipse表示:“类型不匹配:无法从转换为” 在与作者在Github上给出的内容进行比较之后,以下代码进行了编译: 唯一的变化是从“ j”到“(整数j)”。 但是,第一个版本不是与Java 8提供的语法糖完全等同于第二个版本吗?Java为什么拒绝编译它? 谢谢 顺便说一句: 问题答案: 首先

  • 我使用的是Java中的<code>或者</code>的本地实现,它有如下方法: 这两种方法可以编译并正常工作: 此方法不编译: 错误: (我去掉了包限定符,使错误更加易读) 我可以通过指定类型来编译它: 但我为什么需要这样做?我如何避免这种代码混乱?

  • 主要内容:1 Java8 类型推断的介绍,2 Java8 类型推断的案例1,3 Java8 类型推断的案例21 Java8 类型推断的介绍 类型推断是Java的一项功能,它使编译器可以查看每个方法调用和相应的声明以确定参数的类型。 Java在Java 8中提供了类型推断的改进版本。 1.1 Java8以前 在下面的声明中,我们在一侧提到了arraylist的类型。这种方法是在Java 7中引入的。在这里,您可以将第二面留为<>,并且编译器将通过引用变量的类型来推断其类型。 1.2 Java8以后

  • 问题内容: 我正在使用Java 的本地实现,该实现具有如下方法: 这两种方法可以编译并正常工作: 此方法无法编译: 错误: (我已经修剪了包限定符,以使错误更易读) 我可以通过指定类型进行编译: 但是为什么我需要呢?以及如何避免此代码混乱? 问题答案: 此代码应该起作用。 它在最新的JDK 1.8.0_121上编译。 无法在JDK 1.8.0-51上编译。 这意味着它在此版本的JDK中很可能是一个

  • 我有一个奇怪的场景,当使用lambda表达式时,类型推断没有像我预期的那样工作。以下是我真实场景的近似值: 我在倒数第二行得到的编译错误是 方法booleanValue()未为类型Object定义 如果我将lambda转换为

  • 我得到两个错误: Java:不兼容类型:无法推断类型变量R(参数不匹配;方法引用无效) 对toString的引用是不明确的,java.lang.Integer中的方法toString(int)和java.lang.Integer中的方法toString()都是不明确的 并且编译器无法推断所需的方法引用。 但是关于第二个,编译器引用的静态上下文在哪里? 这个错误与Integer类的方法toStrin