2 回答

TA贡献1829条经验 获得超6个赞
你可以这样想方法引用:
Sayable sayable = new Sayable() {
@Override
void say() {
// Grab the body of the method referenced by the method reference,
// which is the following:
System.out.println("Hello, this is static method.");
}
}
方法引用是有效的,因为
目标类型是功能接口 Sayable(您试图将结果存储到Sayable类型中);和
方法引用的签名saySomething()匹配功能接口方法say(),即参数和返回类型匹配1。
被称为变量say()的实例的方法的实现等于方法引用所引用的方法的主体。Sayablesayable
所以就像 JB Nizet 在评论中所说的那样,say()实际上已经实现了。
1一个小细节:“匹配”这个词并不完全意味着“相等”。例如,如果saySomething()
返回一个int
,它仍然可以工作,尽管目标类型的唯一方法将返回类型定义为void
。

TA贡献1873条经验 获得超9个赞
基本上只有一个抽象方法的接口是功能接口。
如果要匿名创建接口对象并调用 MethodReference 的 saySomething()。正常情况下会是这样。。
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
在功能接口的情况下,因为总是只有一种方法。您可以忽略 say() 和相关的大括号 - 这是由 lambdas 提供的。
所以你可以说。
Sayable sayable = MethodReference::saySomething;
这仅适用于功能接口。不适用于具有多个抽象方法的接口。
添加回答
举报