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(文字列);
为什么?
答案 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情况下一样。