【发布时间】:2015-12-07 00:39:01
【问题描述】:
假设我们有一个Iterator<Integer> iterator。因为Iterable是函数式接口,我们可以这样写:
Iterable<Integer> iterable = () -> iterator;
我们当然可以使用iterable作为增强的for循环的表达式:
for (Integer i : iterable) foo(i);
那是为什么
for (Integer i : () -> iterator) foo(i);
不允许? (它会导致以下编译器错误:)
error: lambda expression not expected here
for (Integer i : () -> iterator) foo(i);
^
明确目标类型
for (Integer i : (Iterable<Integer>) () -> iterator) foo(i);
显然有效,但是如果省略 λ 表达式,为什么编译器不能推断出它的目标类型?从 Expression 是 λ 表示法这一事实来看,编译器是否应该不清楚目标类型不能是 Array,因此必须是 Iterable?
这只是语言设计者的疏忽,还是我在这里遗漏了什么?
【问题讨论】:
-
我没有看到 Iterable 标记为
@FunctionalInterface -
@Farrandu 不需要将其标记为 FunctionalInterface 即可成为功能接口
-
@SleimanJneidi 哎呀...你是对的,不知道
-
@Farrandu 不必如此。 JLS 9.8 说
A functional interface is an interface that has just one abstract method (aside from the methods of Object), and thus represents a single function contract.@FunctionalInterface澄清它是用作功能接口的,如果不是,则是编译时错误。 -
它没有被标记为
@FunctionalInterface,因为它并不是特别打算以这种方式使用。
标签: java foreach lambda java-8