我正在尝试使用java 8功能。在阅读official tutorial时,我遇到了这段代码
static void invoke(Runnable r) {
r.run();
}
static <T> T invoke(Callable<T> c) throws Exception {
return c.call();
}
并且有一个问题:
将在以下语句中调用哪种方法?&#34;
String s = invoke(() -> "done");
并回答它是
将调用方法
invoke(Callable<T>)
,因为该方法返回一个值;方法invoke(Runnable)
没有。在这种情况下,lambda表达式() -> "done"
的类型是Callable<T>
。
据我所知,因为invoke
预计会返回String
,所以它会调用Callable的调用。但是,不确定它是如何工作的。
答案 0 :(得分:14)
让我们来看看lambda
invoke(() -> "done");
你只有
的事实"done"
使lambda 值兼容。 lambda的主体(看起来不是可执行语句)隐式变为
{ return "done";}
现在,由于Runnable#run()
没有返回值且Callable#call()
没有,因此将选择后者。
说你写过
invoke(() -> System.out.println());
相反,lambda将被解析为类型Runnable
的实例,因为没有可以用作返回值的表达式。