为什么这适用于有界方法参考?
Why does this work for bounded method reference?
在下面的代码片段中,[1] 似乎产生了预期的结果,而 [2] 抛出了 ClassCastException,如下所示结果如下。
为什么 ClassCastException 在调用 iterator() 而不是在使用方法引用时抛出?
List<String> philosophers = Arrays.asList("Seneca", "Epictetus");
// [1]
for (String s : (Iterable<? extends String>) philosophers::iterator) {
System.out.println(s);
}
// [2]
for (String s: (Iterable<? extends String>) philosophers.iterator()) {
System.out.println(s);
}
[1](使用方法参考时的结果)
`Seneca`
`Epictetus`
[2](调用iterator()时的结果)
Exception in thread "main" java.lang.ClassCastException: class java.util.Arrays$ArrayItr cannot be cast to class java.lang.Iterable`
它们是两个不同的东西。
philosophers::iterator
是一个 函数 ,它在被调用时接受 0 个参数并且 return 是一个迭代器。碰巧的是,这与 Iterable 的定义是兼容的,因为该接口有一个抽象方法可以做到这一点。
philosophers.iterator()
没有 return 函数;它 return 是一个迭代器。 Iterator 不是 Iterable,因此转换失败。
没有充分的理由做这些中的任何一个都是毫无价值的。第一个基本上只是偶然工作。这是使用方法引用的一种非常不直观的方式。就这样
for (String s : philosophers)
在下面的代码片段中,[1] 似乎产生了预期的结果,而 [2] 抛出了 ClassCastException,如下所示结果如下。
为什么 ClassCastException 在调用 iterator() 而不是在使用方法引用时抛出?
List<String> philosophers = Arrays.asList("Seneca", "Epictetus");
// [1]
for (String s : (Iterable<? extends String>) philosophers::iterator) {
System.out.println(s);
}
// [2]
for (String s: (Iterable<? extends String>) philosophers.iterator()) {
System.out.println(s);
}
[1](使用方法参考时的结果)
`Seneca`
`Epictetus`
[2](调用iterator()时的结果)
Exception in thread "main" java.lang.ClassCastException: class java.util.Arrays$ArrayItr cannot be cast to class java.lang.Iterable`
它们是两个不同的东西。
philosophers::iterator
是一个 函数 ,它在被调用时接受 0 个参数并且 return 是一个迭代器。碰巧的是,这与 Iterable 的定义是兼容的,因为该接口有一个抽象方法可以做到这一点。
philosophers.iterator()
没有 return 函数;它 return 是一个迭代器。 Iterator 不是 Iterable,因此转换失败。
没有充分的理由做这些中的任何一个都是毫无价值的。第一个基本上只是偶然工作。这是使用方法引用的一种非常不直观的方式。就这样
for (String s : philosophers)