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);
(仅供参考,您的方法引用语法是错误的 - 它从不使用()
)
TA贡献1801条经验 获得超8个赞
您的第二个代码有两处错误。首先,方法引用根本不使用括号或参数。您只需要提供稍后会调用的方法;那时您没有调用该方法。
其次,该sorted
方法采用Comparator
,而不是提供Comparator
. 该方法需要一个Comparator
已经创建并准备就绪的接口,而不是一个Comparator
在需要时提供的功能接口。
它与Comparator
作为接口的事实无关;通常可以创建对static
接口方法的方法引用。它与sorted
需要实际Comparator
实例而不是功能接口实例的事实有关,此时您可以提供方法引用。
所以即使你去掉括号,它仍然不会编译。只有直接传递 a 的第一个代码Comparator
才能按预期编译和工作。
添加回答
举报