为什么带有void return-type方法的功能接口接受任何return-type方法?

问题描述 投票:4回答:1

我们有此代码:

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

java void functional-interface
1个回答
0
投票

我不确定究竟是什么让您感到困惑,所以这是您查看示例的其他方法。


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)之类的代码而不必处理返回的值)。

© www.soinside.com 2019 - 2024. All rights reserved.