try-with-resource
ステートメントはラムダのタイプを推論できます。enhanced-forステートメントがラムダのタイプを推論できないのはなぜですか?
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(文字列);
なぜですか?
ラムダを 'Iterable'インタフェースの実装にしたいとコンパイラがどのように知っていますか? 'for'ステートメントは' Iterable'を必要としないので、そこから推論することはできません。 JLS [14.14.2。拡張されたfor文](http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2)には次のように書かれています。*式の型はIterable **または配列型**。*これは、推論エンジンが処理できる以上のものです。 – Andreas
@Andreasどのラムダ式も 'String []'型ではありません。したがって、javacは 'Iterable'を推論することができます。 –
saka1029