java 8目标打字

Rou*_*han 8 java lambda

阅读一篇文章状态我来到主题目标打字时我自己有点混淆当我阅读以下段落时:

ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());

这种方法的一个含义是,相同的lambda表达式在不同的上下文中可以有不同的类型:

Callable<String> c = () -> "done";

PrivilegedAction<String> a = () -> "done";
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,lambda表达式() -> "done"表示的实例Callable.在第二种情况下,同一表达式表示PrivilegedAction的实例.

编译器负责推断每个lambda表达式的类型.它使用表达式出现的上下文中的预期类型; 此类型称为目标类型.lambda表达式只能出现在目标类型是功能接口的上下文中.

访问这里的完整文章

您能否以一种简单的方式向我解释以上段落所遵循的这些要点:

  1. 目标类型
  2. 上下文

如果你还给我一个代码片段,我将非常感激

Rea*_*tic 14

上下文

Context是在代码中使用表达式的方式.它不仅仅是lambda表达式 - 它是任何表达式,比如a+b,a++Math.random().

可能的上下文示例:

目标类型

目标类型是预期在给定上下文的类型.例如,如果您将方法定义为:

public int myMethod() { ... }
Run Code Online (Sandbox Code Playgroud)

那么return它的主体语句中的任何表达式都应该具有该类型int.所以,如果你有这个:

return a+b;
Run Code Online (Sandbox Code Playgroud)

在内部myMethod,预计a+b将解析为int可分配给int 的或其他东西.

现在,假设你有这个方法:

public void anotherMethod( double d );
Run Code Online (Sandbox Code Playgroud)

然后,当您调用它并将表达式作为参数传递时,该表达式应为类型double.所以像这样的电话:

anotherMethod(a+b);
Run Code Online (Sandbox Code Playgroud)

期待a+b解决到double.这是它的目标类型.

在你的例子中

在声明中:

Callable<String> c = () -> "done";
Run Code Online (Sandbox Code Playgroud)

表达式是lambda表达式() -> "done".它用于赋值上下文(它被赋值c).而目标类型Callable<String>因为这是你分配任何东西时所期望的c.


有关更正式的讨论,请参阅Java语言规范,第5章.


a3.*_*ity 5

Lambda表达式是功能接口的实例。但是,lambda表达式本身并不包含有关它正在实现哪个功能接口的信息。该信息是从使用它的上下文中推导出来的。例如,表达式

x -> 2 * x 
Run Code Online (Sandbox Code Playgroud)

可以是功能接口的实例

interface IntOperation { int operate(int i); } 
Run Code Online (Sandbox Code Playgroud)

所以写是合法的

IntOperation iop = x -> x * 2; 
Run Code Online (Sandbox Code Playgroud)

此处赋值右侧的表达式的预期类型为IntOperation。这称为lambda表达式的目标类型。显然,lambda表达式可以与不同的功能接口类型兼容,因此可以得出结论,同一lambda表达式在不同的上下文中可以具有不同的目标类型。例如,给定一个接口

interface DoubleOperation { double operate(double i); } 
Run Code Online (Sandbox Code Playgroud)

写也是合法的

DoubleOperation dop = x -> x * 2; 
Run Code Online (Sandbox Code Playgroud)

Lambda表达式的目标类型必须是一个函数接口,并且与该目标类型兼容,该Lambda表达式必须具有与该接口的函数类型相同的参数类型,其返回类型必须与该函数类型兼容,并且只能抛出函数类型允许的异常。

礼貌:lambda表达式的类型是什么?

让我添加有关Lambda的资源。这对于在Lambdas上下文中清楚地理解许多概念很有帮助。该资源是LAMBDA常见问题解答。{免责声明:我与网站没有任何关系。我刚巧访问了该站点,所以我想推荐它,以便人们可以从中受益。}希望它能有所帮助。