vip*_* cp 3 java lambda java-8 functional-interface
考虑以下两个功能接口(java.lang.Runnable and java.util.concurrent.Callable<V>):
public interface Runnable {
void run();
}
public interface Callable<V> {
V call();
}
Run Code Online (Sandbox Code Playgroud)
假设您有overloaded如下方法调用:
void invoke(Runnable r) {
r.run();
}
<T> T invoke(Callable<T> c) {
return c.call();
}
Run Code Online (Sandbox Code Playgroud)
考虑以下方法调用
String s = invoke(() -> "done");
Run Code Online (Sandbox Code Playgroud)
这会打电话给invoke(Callable)。但是如何?编译器如何确定Type为可调用类型?我从阅读的Oracle文档中看不懂。
您() -> "done"是一个返回值且没有输入参数的lambda。由于Runnable既没有返回值也没有输入参数,() -> "done"因此无法匹配您的重载的签名invoke(Runnable)。
如果要使用添加签名Supplier(或任何不带参数但返回值的其他功能接口),则无法确定要调用Callable还是Supplier版本。
因为() -> "done"返回字符串值“ done”,这是calla 的方法Callable负责的:
String s = invoke(() -> "done");
// from impl. of 'invoke', the variable 's' is assigned value "done"
Run Code Online (Sandbox Code Playgroud)
另一方面run是一种void方法,与该类型匹配的方法Runnable可能存在一个无效调用,例如:
invoke(() -> System.out.println("done"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |