我正在尝试使用java 8功能.在阅读官方教程时,我遇到了这段代码
static void invoke(Runnable r) {
r.run();
}
static <T> T invoke(Callable<T> c) throws Exception {
return c.call();
}
Run Code Online (Sandbox Code Playgroud)
并且有一个问题:
将在以下语句中调用哪种方法?"
String s = invoke(() -> "done");
并回答它
该方法
invoke(Callable<T>)将被调用因为该方法返回的值; 方法invoke(Runnable)没有.在这种情况下,lambda表达式的类型() -> "done"是Callable<T>.
据我所知,因为invoke预期返回a String,它会调用Callable的调用.但是,不确定它是如何工作的.
Sot*_*lis 14
我们来看看lambda
invoke(() -> "done");
Run Code Online (Sandbox Code Playgroud)
事实上你只有
"done"
Run Code Online (Sandbox Code Playgroud)
使lambda 值兼容.lambda的主体,似乎不是一个可执行语句,隐含地变成了
{ return "done";}
Run Code Online (Sandbox Code Playgroud)
现在,既然Runnable#run()没有返回值,Callable#call()那么将选择后者.
说你写了
invoke(() -> System.out.println());
Run Code Online (Sandbox Code Playgroud)
相反,lambda将被解析为一个类型的实例Runnable,因为没有可以用作返回值的表达式.