我正在阅读新发布的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)
答案 0 :(得分:15)
首先,纠正您的术语:当您说 syntax sugar 时,您真正要问的是类型推断,当被要求推断{{1>的类型时在内部lambda中,编译器无法提供正确的类型。
其次,更正您的数据:您引用的错误消息不是来自JDK编译器;他们来自Eclipse。
这只是一个Eclipse错误。参考编译器(来自Oracle JDK的j
)处理你的第一个例子就好了。