是否可以将方法引用与接口的静态方法一起使用?
Is it possible to use method reference with static method of interface?
这是我的第一个代码:
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 种情况下使用带有 class 的方法参考:
Class
Class::staticMethod
Class::实例方法
实例::实例方法
Class::新
功能接口
- 接口::抽象方法
非常感谢!
您的第二个代码有两处错误。首先,方法引用根本不使用括号或参数。您只需要提供稍后将调用的方法;您此时没有调用该方法。
其次,sorted
方法采用 Comparator
,而不是提供 Comparator
的功能接口。该方法需要一个已经创建并准备就绪的 Comparator
,而不是一个将在需要时提供 Comparator
的功能接口。
与Comparator
是接口无关;通常可以创建对 static
接口方法的方法引用。它与 sorted
需要一个实际的 Comparator
实例而不是功能接口的实例这一事实有关,这是您可以提供方法引用的时候。
所以即使你去掉括号,它仍然无法编译。只有直接传递 Comparator
的第一个代码才能按预期编译和工作。
Comparator.reverseOrder()
是一个解析为 Comparator
类型的表达式,因为它就是 returns.
Comparator::reverseOrder
是一个表达式,它解析为 一个不带参数的方法 和 returns 一个 Comparator
例如Supplier<Comparator<String>>
,尽管它可以是任何匹配的功能接口。
在第二个实例中,您试图将一个方法(提供 Comparator
)作为参数传递。该方法不需要那个 - 它只需要 Comparator
本身。
你可以这样想(只是伪代码来证明这一点):
s.sorted(new Comparator())
对比
s.sorted(new Supplier(new Comparator()))
回答你的第二个问题,即是否可以对接口的静态方法使用方法引用 - 是的,绝对可以!
如果我们声明如下方法:
<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
那么我们肯定可以用方法引用来调用它
giveMeAComparatorSupplier(Comparator::reverseOrder);
(仅供参考,您的方法引用语法错误 - 它从不使用 ()
)
这是我的第一个代码:
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 种情况下使用带有 class 的方法参考:
Class
Class::staticMethod
Class::实例方法
实例::实例方法
Class::新
功能接口
- 接口::抽象方法
非常感谢!
您的第二个代码有两处错误。首先,方法引用根本不使用括号或参数。您只需要提供稍后将调用的方法;您此时没有调用该方法。
其次,sorted
方法采用 Comparator
,而不是提供 Comparator
的功能接口。该方法需要一个已经创建并准备就绪的 Comparator
,而不是一个将在需要时提供 Comparator
的功能接口。
与Comparator
是接口无关;通常可以创建对 static
接口方法的方法引用。它与 sorted
需要一个实际的 Comparator
实例而不是功能接口的实例这一事实有关,这是您可以提供方法引用的时候。
所以即使你去掉括号,它仍然无法编译。只有直接传递 Comparator
的第一个代码才能按预期编译和工作。
Comparator.reverseOrder()
是一个解析为 Comparator
类型的表达式,因为它就是 returns.
Comparator::reverseOrder
是一个表达式,它解析为 一个不带参数的方法 和 returns 一个 Comparator
例如Supplier<Comparator<String>>
,尽管它可以是任何匹配的功能接口。
在第二个实例中,您试图将一个方法(提供 Comparator
)作为参数传递。该方法不需要那个 - 它只需要 Comparator
本身。
你可以这样想(只是伪代码来证明这一点):
s.sorted(new Comparator())
对比
s.sorted(new Supplier(new Comparator()))
回答你的第二个问题,即是否可以对接口的静态方法使用方法引用 - 是的,绝对可以!
如果我们声明如下方法:
<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
那么我们肯定可以用方法引用来调用它
giveMeAComparatorSupplier(Comparator::reverseOrder);
(仅供参考,您的方法引用语法错误 - 它从不使用 ()
)