微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这适用于有界方法引用?

如何解决为什么这适用于有界方法引用?

在下面的代码段中,[1] 似乎产生了预期的结果,而 [2] 抛出了 ClassCastException,如下面的结果所示。

为什么在调用 iterator() 而不是在使用方法引用时会抛出 ClassCastException

& | ^

[1](使用方法引用时的结果)

 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);
 }

[2](调用 iterator() 时的结果)

`Seneca`
`Epictetus`

解决方法

它们是两种不同的东西。

philosophers::iterator 是一个 函数,它在调用时接受 0 个参数并返回一个迭代器。碰巧的是,这与 Iterable 的定义是兼容的,因为该接口有一个单独的抽象方法可以做到这一点。

philosophers.iterator() 不返回函数;它返回一个迭代器。 Iterator 不是 Iterable,因此转换失败。


没有充分的理由去做这两项中的任何一项都是毫无价值的。第一个基本上只是偶然工作。这是使用方法引用的一种非常不直观的方式。就做

for (String s : philosophers)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。