Предположим, что a Iterator<Integer> iterator
. Поскольку Iterable
является функциональным интерфейсом, мы можем написать:
Iterable<Integer> iterable = () -> iterator;
Мы можем, конечно, использовать Iterable
как расширенный для цикла Expression:
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);
очевидно работает, но почему компилятор не может вывести целевой тип λ-выражения, если он опущен? Из того факта, что выражение выражено в λ-нотации, должно ли не ясно, компилятору, что целевой тип не может быть Array
и, следовательно, должен быть Iterable
?
Это просто недосмотр дизайнеров языка, или есть что-то еще, что я здесь отсутствует?