为什么在Eclipse中使用类型推理编译的这个java 8示例?

Ton*_*ang 8 java lambda java-8

我正在阅读新发布的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());
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)

唯一的变化是从"j"到"(整数j)".

但是第一个版本是不是完全等同于Java 8提供的语法糖的第二个版本?为什么Java拒绝编译它?

谢谢

BTW:

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)
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 15

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

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

这只是一个Eclipse bug.参考编译器(javac来自Oracle JDK)处理你的第一个例子就好了.

  • +1并添加另一个诊断位:`Stream <int []> pairs = numbers1.stream().flatMap(i - > numbers2.stream().map(j - > new int [] {i,j}) `;编译好,所以只有最后一步(`.collect()`)是推理失败的地方. (2认同)