当前位置: 首页 > 面试题库 >

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

干善
2023-03-14
问题内容

我在阅读新发布的Java 8 in Action,发现从第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表示:“类型不匹配:无法从转换List<Object>List<int[]>

在与作者在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)”。

但是,第一个版本不是与Java 8提供的语法糖完全等同于第二个版本吗?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)

问题答案:

首先,纠正您的术语:说 语法糖时 ,您真正要问的是 类型推断 ,即当要求j在内部lambda中为一个类型推断类型时,编译器将无法提出正确的类型。

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

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



 类似资料:
  • 我正在阅读新发布的Java 8在行动中,发现有一段从第5章粘贴的代码没有编译: Eclipse说:“类型不匹配:无法从< code >列表转换 在与作者在Github上给出的内容进行比较后,编译如下: 唯一的变化是从“j”到“(整数j)”。 但是,第一个版本与第二个版本在Java8提供的语法糖中不是完全相同吗?为什么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转换为