当 SAM 方法在 Java 中不返回值时,Lambda 会返回一个值


@FunctionalInterface
public interface Runnable {
public abstract void run();
}
public class MethodReference1 {
public static String ThreadStatus() {
System.out.println( Thread.currentThread().getName() +  " is running...");
return "threadname";
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> ThreadStatus());
t1.start();
}
}

在上面使用 Java 8 的示例中,ThreadStatus(( 返回一个字符串,但 Runnable 接口 "run((" 方法不返回任何值。但它仍然有效(没有编译/运行时错误(。我想知道它是如何工作的,因为根据 lamba 规范,SAM 应该具有完全相同的签名。

如果我翻转 ThreadStatus 方法不返回任何值的情况并更改函数接口方法以返回值,则会出现编译时错误。

有人可以帮助我理解这一点吗?

这是因为Thread t1 = new Thread(() -> ThreadStatus());等效于:

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ThreadStatus();
}
});

所以你没有从run()那里返回任何东西.run()只是被指示调用ThreadStatus()方法并忽略返回值。

最新更新