这是我的第一个代码:
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);
//...
}
}
结果:编译器错误
我的问题: 为什么第二段代码会出现编译错误? 函数式接口(interface)的静态方法不能使用方法引用吗?
我知道我不能将方法引用与功能接口(interface)的默认方法一起使用。 我知道我可以在 5 种情况下对类使用方法引用:
类别
类::staticMethod
类::instanceMethod
实例::实例方法
类::new
功能接口(interface)
- 接口(interface)::abstractMethod
非常感谢!
最佳答案
Comparator.reverseOrder()
是一个解析为 Comparator
的表达式类型,因为这就是它返回的内容。
Comparator::reverseOrder
是一个解析为方法的表达式,该方法不带参数并返回 Comparator
例如一个Supplier<Comparator<String>>
,尽管它可以是任何匹配的功能接口(interface)。
在第二个实例中,您尝试传递一个方法(提供 Comparator
)作为参数。该方法不需要那样 - 它只想要 Comparator
本身。
你可以这样想(只是用伪代码来演示这一点):
s.sorted(new Comparator())
对比
s.sorted(new Supplier(new Comparator()))
<小时/>
回答你的第二个问题,即是否可以对接口(interface)的静态方法使用方法引用 - 是的,绝对可以!
如果我们声明以下方法:
<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
那么我们肯定可以通过方法引用来调用它
giveMeAComparatorSupplier(Comparator::reverseOrder);
<小时/>
(仅供引用,您的方法引用语法是错误的 - 它从不使用 ()
)
关于java - 是否可以将方法引用与接口(interface)的静态方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747731/