方法参考投射如何工作? [英] How does method reference casting work?
问题描述
public class Main {
interface Capitalizer {
public String capitalize(String name);
}
public String toUpperCase() {
return "ALLCAPS";
}
public static void main(String[] args) {
Capitalizer c = String::toUpperCase; //This works
c = Main::toUpperCase; //Compile error
}
}
两者都是具有相同签名的实例方法。为什么一个工作而另一个不工作?
Both are instance methods with same signature. Why does one work and the other doesn't?
签名 String :: toUpperCase
: String toUpperCase();
推荐答案
有3种结构可供参考方法:
There are 3 constructs to reference a method:
-
object :: instanceMethod
-
Class :: staticMethod
-
Class :: instanceMethod
object::instanceMethod
Class::staticMethod
Class::instanceMethod
该行:
Capitalizer c = String::toUpperCase; //This works
使用3'rd构造 - Class :: instanceMethod
。在这种情况下,第一个参数成为方法的目标。此构造与以下Lambda等效(翻译):
use 3'rd construct - Class::instanceMethod
. In this case first parameter becomes the target of the method. This construct is equivalent (translates) to following Lambda:
Capitalizer = (String x) -> x.toUpperCase();
此Lambda表达式有效,因为Lambda 获取 String
作为参数并返回字符串
结果 - 根据 Capitalizer
界面的要求。
This Lambda expression works because Lambda gets String
as parameter and returns String
result - as required by Capitalizer
interface.
该行:
c = Main::toUpperCase; //Compile error
转换为:
(Main m) -> m.toUpperCase();
哪个不适用于 Capitalizer
界面。您可以通过将 Capitalizer
更改为:
Which does not work with the Capitalizer
interface. You could verify this by changing Capitalizer
to:
interface Capitalizer {
public String capitalize(Main name);
}
此更改后 Main :: toUpperCase
将编译。
这篇关于方法参考投射如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!