java - 是否可以将方法引用与接口的静态方法一起使用?
问题描述
这是我的第一个代码:
public class MethodReference {
public static void main (String []args) {
Stream<String> s = Stream.of("brown bear", "grizzly");
s.sorted(Comparator.reverseOrder()).forEach(System.out::print);
//...
}
}
结果:灰棕熊
这是我的第二个代码:
public class MethodReference {
public static void main (String []args) {
Stream<String> s = Stream.of("brown bear", "grizzly");
s.sorted(Comparator::reverseOrder()).forEach(System.out::print);
//...
}
}
结果:编译器错误
我的问题:为什么第二个代码中有编译器错误?我不能将方法引用用于功能接口的静态方法吗?
我知道我不能将方法引用与功能接口的默认方法一起使用。我知道我可以在 5 种情况下对类使用方法引用:
班级
类::静态方法
类::实例方法
实例::实例方法
类::新
功能接口
- 接口::抽象方法
非常感谢!
解决方案
Comparator.reverseOrder()
是一个解析为类型的表达式Comparator
,因为这就是它返回的内容。
Comparator::reverseOrder
是一个表达式,它解析为不带参数并返回例如 a 的方法,尽管它可以是任何匹配的功能接口。Comparator
Supplier<Comparator<String>>
在第二种情况下,您尝试将方法(提供 a Comparator
)作为参数传递。该方法不想要那个 - 它只想要它Comparator
自己。
你可以这样想(只是伪代码来证明这一点):
s.sorted(new Comparator())
对比
s.sorted(new Supplier(new Comparator()))
要回答您的第二个问题,即是否可以将方法引用用于接口的静态方法 - 是的,绝对!
如果我们声明以下方法:
<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
那么我们绝对可以用方法引用来调用它
giveMeAComparatorSupplier(Comparator::reverseOrder);
(仅供参考,您的方法参考语法是错误的 - 它从不使用()
)
推荐阅读
- python - Python正则表达式在单引号内获取最长的文本
- java - JUnit 测试中的回调响应
- javascript - 自动生成输入 PUREj-s
- ios - SwiftUI - How to avoid to refresh a List when a state var from the same struct is modified
- sql - SQLite - 使用独特的非 PK 列作为 FK 的任何长期缺点?
- ruby-on-rails - 在 Ruby on Rails 表单上使用 datalist 显示名称但传递 id 参数
- amazon-web-services - 无效的参数值:名为 *** 的 AWS 环境对于此操作处于无效状态。必须准备好
- c# - 使一个类只能从另一个类使用
- scala - 鉴于 bindAndHandle 方法采用 Flow 而不是 Route 类型的第一个参数,Scala 程序如何编译?
- aws-glue - 如何使用 AWS java SDK 使用 AWS 粘合作业生成自动脚本