没有类型的Lambda表达式

Nem*_*Sol 5 java lambda java-8

我理解Java8 lambda表达式的语法,但为什么下面的代码在没有x的特定类型声明的情况下工作?为什么要打印"巴兹"?

public class LambdaExpressions {

    interface Foo {
        void bar(Object o);
    }

    static void doo(Foo f) {
        f.bar("baz");
    }

    public static void main(String[] args) {

        doo( x -> {System.out.println(x);});
    }

}
Run Code Online (Sandbox Code Playgroud)

cri*_*007 6

由于接口是标准功能接口

它是一个功能界面,因为它只包含一个抽象方法.此方法接受一个参数并返回[void]值

(为这个问题重新编写)

lambda表达式 x -> { System.out.println(x); }可以重写为匿名类.

new Foo() {
    @Override
    public void bar(Object x) {
        System.out.println(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

当您调用doo,则通过这个功能接口f,其然后执行f.bar("baz");,所以"baz"就是x,它被打印.

在一个主要方法中,这看起来像

public static void main(String[] args) {
    Foo f = new Foo() {
        @Override
        public void bar(Object x) {
            System.out.println(x);
        }
    };

    f.bar("baz");
}
Run Code Online (Sandbox Code Playgroud)


man*_*uti 5

参数的类型根据规范x推断:

\n\n
\n

lambda 表达式的形式参数可以具有声明的类型或推断的类型。这些样式不能混合:lambda 表达式不可能声明其某些参数的类型,而让其他参数的类型被推断。只有具有声明类型的参数才能具有修饰符。

\n
\n\n

在这种情况下,编译器会推断类型为,Object因为该方法接受函数接口,而该方法接受Object. 规范的该部分还提到:

\n\n
\n

如果形式参数具有推断类型,则这些类型是从 lambda 表达式所针对的函数接口类型派生的 (\xc2\xa715.27.3)。

\n
\n