lambda表达式的隐式类型转换

And*_*niy 3 java lambda overloading type-conversion java-8

考虑以下课程:

public void method() {
    test(() -> { });
}

void test(Runnable a) {
    System.out.println("Test 1");
}

void test(A a) {
    System.out.println("Test 2");
}

interface A extends Runnable {

}
Run Code Online (Sandbox Code Playgroud)

调用方法method()将导致Test 2输出.这意味着,lambda表达式() -> { }被隐式转换为A.为什么?

Sot*_*lis 7

这是适用于所有重载的相同标准规则.Java将选择最具体的适用方法.

两种方法都接受一个功能接口类型的参数.lambda表达式

() -> { }
Run Code Online (Sandbox Code Playgroud)

可转换为这两种类型.A是一个子类,Runnable因此更具体.A因此,选择具有参数类型的方法.