方法参数的目标类型转换,Lambda

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文档中看不懂。

Kay*_*man 6

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

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


Nam*_*man 6

因为() -> "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)