为什么增强型for语句不能推断lambda的类型?

时间:2017-06-28 01:36:03

标签: java lambda

try-with-resource语句可以推断出lambda的类型。

try (Closeable 最後に実行 = () -> System.out.print("終了")) {
    System.out.println("開始");
}

但是enhanced-for声明不能。

Iterator<String> 繰り返し = Arrays.asList("いち", "に", "さん").iterator();
for (String 文字列 : () -> 繰り返し)   // compile error!
    System.out.println(文字列);

我们必须这样写。

Iterator<String> 繰り返し = Arrays.asList("いち", "に", "さん").iterator();
for (String 文字列 : (Iterable<String>)() -> 繰り返し)
    System.out.println(文字列);

为什么?

1 个答案:

答案 0 :(得分:0)

尝试使用resorce可以推断,因为您已声明了预期的结果类型:

try (Closeable 最後に実行 = () -> System.out.print("終了")) {
     ^^^^^^^^^

Javac知道该变量赋值的目标类型,该lambda应该转换为Closeable。但是在增强中没有这样的目标类型信息。可能有多种目标类型:

  • Iterable<String>当然
  • public interface StringIterable extends Iterable<String>
  • public interface WeridIterable extends Iterable<String>
  • ...

有任意数量的可能目标类型,因此您必须使用(Iterable<String>)明确地提供它,就像在try-with-resource情况下一样。