我们有此代码:
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
我不确定究竟是什么让您感到困惑,所以这是您查看示例的其他方法。
J j = Test::foo;
可以改写为
J j = () -> Test.foo();
这是功能接口J
的实现,其中抽象方法m()
的主体由lambda提供。
我们也可以写成
J j = new J(){
public void m(){
Test.foo(); //correct despite `foo` returning value
}
};
这是正确的代码,因为返回的值可以忽略(例如List#add
也返回boolean
的值,但是我们可以编写list.add(1)
之类的代码而不必处理返回的值)。