【发布时间】:2019-09-27 11:09:09
【问题描述】:
我们有这个代码:
public class Test {
public static Object foo() {
System.out.println("Foo");
return new Object();
}
public static void main(String[] args) {
J j = Test::foo;
j.m();
}
}
interface J {
void m();
}
并且此代码将起作用。关键是
J j = Test::foo;
虽然interface J 声明它有一个void 函数,但Test::foo 返回一个Object。
虽然我们不能在实现接口时覆盖方法(这很明显)。
这仅在接口的方法为void 时有效,否则代码不会被编译。有人能说出为什么这会以它的工作方式工作吗? :D
【问题讨论】:
-
lambda 只是一个语法糖,当返回类型不是
void时添加一个return 语句。如果返回不是 void 并且类型不匹配,则编译器会抱怨。 -
对此可能有很好的技术解释,但基本上它是语法糖。你总是可以忽略一个返回值(来自
foo()),但是你不能弥补一个,所以它不能反过来工作(foo()是void和m()有一个返回类型) . -
我想你已经得到了答案:返回类型不是
void时会添加return语句。 -
我认为它记录在JLS 15.13.2. Type of a Method Reference - 相关文本:“......方法引用表达式与函数类型一致,如果......函数类型的结果是无效...... "
标签: java void functional-interface