当前位置: 首页 > 面试题库 >

Java 8:目标输入

邓德本
2023-03-14
问题内容

在阅读 Lambda的状态一文时, 我遇到了 目标打字 这一主题,我对以下段落感到有些困惑:

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

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

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

PrivilegedAction<String> a = () -> "done";

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

编译器负责推断每个lambda表达式的类型。它使用表达式出现的上下文中期望的类型。这种类型称为目标类型。Lambda表达式只能出现在目标类型为功能接口的上下文中。

您能否以简单的方式向我解释与引用的段落有关的这些要点:

  1. 目标类型
  2. 语境

如果您还提供代码段,我将非常感谢。


问题答案:

上下文 是在代码中使用表达式的方式。这不只是lambda表达式-这是任何表情,像a+ba++Math.random()

可能的情况示例:

  • 作业: 取表达式a+b。如果将其分配给变量,则会在分配上下文中使用它:

    c = a+b;
    
  • 方法或构造函数的参数: 。这是当您将其传递给某些方法调用时:

    System.out.println(a+b);
    
  • 返回值:return语句中使用表达式时:

    return a+b;
    
  • 数组索引: 当您的表达式是数组索引时:

    x[a+b] = 3;
    

目标类型

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

public int myMethod() { ... }

那么return语句主体中的任何表达式都应该具有类型int。因此,如果您有:

return a+b;

在内部myMethod,预计a+b将解析为int或可分配给int的内容。

现在,假设您具有以下方法:

public void anotherMethod( double d );

然后,当您调用它并传递一个表达式作为参数时,该表达式应为type double。像这样的电话:

anotherMethod(a+b);

希望a+b解决一个double。那是它的 目标类型

在你的例子中

声明中:

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

该表达式是lambda表达式() -> "done"。在 分配 环境中使用它(分配给c)。而 目标类型
Callable<String>因为这是您向分配任何内容时所期望的c

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



 类似资料:
  • 使用jdk 1.8.051Source=1.7,target=1.7 Junit 4.6,ant 1.8.0 发生了什么事<所有以1.7通过的测试现在都失败了。我需要知道以下几点: 为什么会这样? 有没有像-XX:-UseSplitVeriator(java 1.7)这样的选项 如何找出问题的根源? 要采取什么步骤来解决这个问题? 我们有用于构建、部署和测试的ant目标 构建和部署工作正常,但Ju

  • 如下图所示,SonarSource在11之前的Java版本中终止了对运行代码分析器的支持 我试图搜索一个完整的示例,说明如何使用Java11分析器运行bitbucket管道来执行SonarScanner分析,但目标代码使用Java11之前的版本(例如Java8),但我找不到一个。根据那个形象,应该是可能的。

  • 我正试图在quarkus应用程序目录中创建我的“数据”文件夹。我试过用文档写的所有东西,比如应用程序。属性、maven属性和创建资源配置。json。我得到的最好结果是保存资源配置。将json文件本身放入-Pnative building中。如果能帮我解决这个问题,我将不胜感激!在此处输入图像描述 Quarkus属性: pom文件本身:

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用

  • 本文向大家介绍Java8中对泛型目标类型推断方法的改进,包括了Java8中对泛型目标类型推断方法的改进的使用技巧和注意事项,需要的朋友参考一下 一、简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量”。这种类型变量可以用在类、接口和方法的创建中。 理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你

  • 问题内容: 在使用树集时,我发现了非常奇怪的行为。 根据我的理解,以下程序应打印两条相同的行: 但奇怪的是它打印: 我无法理解-为什么树集的行为如此? 问题答案: 发生这种情况是因为SortedSet的Comparator用于排序,但是removeAll依赖于每个元素的方法。从SortedSet文档中: 请注意,如果排序集要正确实现接口,则排序集(无论是否提供显式比较器)所维护的顺序必须 与equ