【问题标题】:Target type casting for method arguments , Lambda方法参数的目标类型转换,Lambda
【发布时间】:2019-09-04 09:51:29
【问题描述】:

考虑以下两个功能接口(@98​​7654321@):

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 文档中理解。

【问题讨论】:

  • 这真的可以编译吗?
  • @christopher 是的。

标签: java lambda java-8 functional-interface


【解决方案1】:

由于() -&gt; "done" 返回一个字符串值"done",这是Callablecall 方法负责的:

String s = invoke(() -> "done"); 
// from impl. of 'invoke', the variable 's' is assigned value "done"

另一方面,run 是一个void 方法,与Runnable 类型匹配的可能会有一个 void 调用,例如:

invoke(() -> System.out.println("done"))

【讨论】:

    【解决方案2】:

    您的 () -&gt; "done" 是一个 lambda,它返回一个值并且没有输入参数。由于Runnable 既没有返回值也没有输入参数,() -&gt; "done" 不能匹配你的重载签名invoke(Runnable)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多