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

时间:2014-09-15 17:56:56

标签: 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());

Eclipse说:&#34;类型不匹配:无法从List<Object>转换为List<int[]>&#34;

与作者在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());

唯一的变化来自&#34; j&#34;到&#34;(整数j)&#34;。

但是,第一个版本与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)

1 个答案:

答案 0 :(得分:15)

首先,纠正您的术语:当您说 syntax sugar 时,您真正要问的是类型推断,当被要求推断{{1>的类型时在内部lambda中,编译器无法提供正确的类型。

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

这只是一个Eclipse错误。参考编译器(来自Oracle JDK的j)处理你的第一个例子就好了。