首页 > 解决方案 > 方法参数的目标类型转换,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 文档中理解。

标签: javalambdajava-8functional-interface

解决方案


Your() -> "done"是一个 lambda,它返回一个值并且没有输入参数。由于Runnable既不返回值也没有输入参数,() -> "done"因此无法匹配您的重载签名invoke(Runnable)

如果您要添加签名Supplier(或任何其他不带参数但返回值的功能接口),它将无法确定您是否要调用版本CallableSupplier版本。


推荐阅读