为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以将方法引用与接口的静态方法一起使用?

是否可以将方法引用与接口的静态方法一起使用?

叮当猫咪 2021-11-11 13:17:34
这是我的第一个代码: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 种情况下对类使用方法引用:班级类::静态方法类::实例方法实例::实例方法类::新功能接口接口::抽象方法非常感谢!
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

Comparator.reverseOrder()是一个解析为Comparator类型的表达式,因为这就是它返回的内容。

Comparator::reverseOrder是一个表达式,它解析为一个不带参数并返回一个Comparator例如 a 的方法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);

(仅供参考,您的方法引用语法是错误的 - 它从不使用()


查看完整回答
反对 回复 2021-11-11
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您的第二个代码有两处错误。首先,方法引用根本不使用括号或参数。您只需要提供稍后会调用的方法;那时您没有调用该方法。

其次,该sorted方法采用Comparator,而不是提供Comparator. 该方法需要一个Comparator已经创建并准备就绪的接口,而不是一个Comparator在需要时提供的功能接口。

它与Comparator作为接口的事实无关;通常可以创建对static接口方法的方法引用。它与sorted需要实际Comparator实例而不是功能接口实例的事实有关,此时您可以提供方法引用。

所以即使你去掉括号,它仍然不会编译。只有直接传递 a 的第一个代码Comparator才能按预期编译和工作。


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信