java - 方法参数的目标类型转换,Lambda
问题描述
考虑以下两个功能接口 ( java.lang.Runnable and java.util.concurrent.Callable<V>
):
public interface Runnable {
void run();
}
public interface Callable<V> {
V call();
}
假设您overloaded
的方法调用如下:
void invoke(Runnable r) {
r.run();
}
<T> T invoke(Callable<T> c) {
return c.call();
}
考虑下面的方法调用
String s = invoke(() -> "done");
这将调用invoke(Callable)
. 但是如何?编译器如何确定类型是可调用的?我没有从我读过的 Oracle 文档中理解。
解决方案
Your() -> "done"
是一个 lambda,它返回一个值并且没有输入参数。由于Runnable
既不返回值也没有输入参数,() -> "done"
因此无法匹配您的重载签名invoke(Runnable)
。
如果您要添加签名Supplier
(或任何其他不带参数但返回值的功能接口),它将无法确定您是否要调用版本Callable
或Supplier
版本。
推荐阅读
- python - Django sqlite3 数据库显示在 HTML 表上
- .net-core - NetCore.App SDK 中 .Net Framework 依赖项的用途?
- c++ - 使用boost将单线程转为多线程
- python-3.x - 创建目录树并将其作为输入以再次创建相同的树
- openlayers - OSM 和 OpenLayers 之间哪个更好
- arrays - 如何在swift中按日期对字典数组中的项目进行排序
- html - 如何使用 flexbox 在整个页面上拉伸标题并使用响应屏幕状态
- r - 删除 R 中重复项不准确的行
- spring-boot - 如何在spring boot中使用http补丁请求?
- jquery - 鼠标事件名称