为什么带有 void 返回类型方法的函数接口接受任何返回类型方法?

Yev*_*nov 5 java void functional-interface

我们有这个代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

这段代码会起作用。关键线是

J j = Test::foo;
Run Code Online (Sandbox Code Playgroud)

虽然interface J声明它有一个void函数,但Test::foo返回一个Object.

虽然我们不能在实现接口时覆盖方法(这是显而易见的)。这仅在接口的方法为 时有效void,否则不会编译代码。有人能说出为什么这会以这种方式工作吗?:D

And*_*lko 3

\n

虽然interface J声明它有一个void函数,但Test::foo返回一个Object.

\n
\n\n

这么说是不准确的Test::foo。在不同的上下文中,它可能意味着不同的事情。

\n\n
Supplier<Object>  a = Test::foo;\nJ                 b = Test::foo;\nRunnable          c = Test::foo;\n
Run Code Online (Sandbox Code Playgroud)\n\n

更准确的说法是Test::foo可以表示一个目标类型 ,其函数方法void返回或Object

\n\n

这是表达式语句的示例 (jls-14.8)

\n\n
\n

如果目标类型的函数类型有返回void值,则 lambda 主体是语句表达式( \xc2\xa714.8 ) 或 void 兼容块 ( \xc2\xa715.27.2 )。
\n ...
\n 表达式语句通过计算表达式来执行;如果表达式有值,该值将被丢弃。

\n
\n