为什么我需要一个函数式接口来使用 lambda?

2023-12-06

我认为这个问题已经存在于某处,但我无法找到它。

我不明白为什么需要一个函数式接口来使用 lambda。考虑以下示例:

public class Test {

    public static void main(String...args) {
        TestInterface i = () -> System.out.println("Hans");
//      i = (String a) -> System.out.println(a);

        i.hans();
//      i.hans("Hello");
    }
}

public interface TestInterface {
    public void hans();
//  public void hans(String a);
}

这可以正常工作,但如果取消注释行,则不会出现问题。为什么?根据我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。为什么我需要一个函数式接口并破坏我的代码?

编辑:链接的重复项没有回答我的问题,因为我正在询问不同的方法参数。但我在这里得到了一些非常有用的答案,感谢所有提供帮助的人! :)

EDIT2:抱歉,我显然不是母语人士,但准确地说:

public interface TestInterface {
    public void hans();                 //has no input parameters</br>
    public void hans(String a);         //has 1 input parameter, type String</br>
    public void hans(String a, int b);  //has 2 input parameters, 1. type = String, 2. type = int</br>
    public void hans(int a, int b);     //has also 2 input parameters, but not the same and a different order than `hans(String a, int a);`, so you could distinguish both
}

public class Test {

    public static void main(String...args) {
        TestInterface i = () -> System.out.println("Hans");
        i = (String a) -> System.out.println(a);
        i = (String a, int b) -> System.out.println(a + b);
        i = (int a, int b) -> System.out.println(a);

        i.hans(2, 3);   //Which method would be called? Of course the one that would take 2 integer arguments. :)
    }
}

我所问的只是关于论点。方法名称并不重要,但每个方法都采用不同参数的唯一顺序,因此,Oracle 可以实现此功能,而不是只为每个“Lambda 接口”提供一个方法。


当你写:

TestInterface i = () -> System.out.println("Hans");

你给了一个实现void hans()的方法TestInterface.

如果您可以将 lambda 表达式分配给具有多个抽象方法的接口(即非函数式接口),则 lambda 表达式只能实现其中一种方法,而无法实现其他方法。

您无法通过将两个具有不同签名的 lambda 表达式分配给同一个变量来解决该问题(就像您无法将两个对象的引用分配给单个变量并期望该变量同时引用这两个对象一样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我需要一个函数式接口来使用 lambda? 的相关文章

随机推荐

  • 有没有可以将数字拼音转换为带有声调标记的拼音的库?

    只是想知道是否有人知道可以将汉语拼音转换为声调的类库 例如 nin2 hao3 ma 到 n n h o ma 它会类似于这个答案 但希望使用 NET 框架 这是我对 Greg Hewgill 的移植蟒蛇算法到 C 到目前为止我还没有遇到任
  • 刚开始学习Java。为什么 main() 位于类内部?

    我正在学习 Java 我注意到main 被放在一个类中 为什么 我不考虑我的main 成为任何对象的成员 所以请告诉我如何解决这个问题 我不考虑我的main 成为任何对象的成员 这不是因为它是一个static方法 它不属于任何对象 而是属于
  • 在法国机器上执行时出现 java.lang.NumberFormatException

    在下面的代码中 在解析值时 有时我会在法国机器上遇到 NumberFormat 异常 double txPower DecimalFormat df new DecimalFormat txPower txPower getDeltaP l
  • 在 Windows 主机上调试 VMWare 中的 Linux 内核

    我正在开发我的第一个内核模块 所以我对此有点陌生 我的模块偶尔会产生恐慌 并且我无法使用 printk 深入了解它 据我所知 我的调试选项是 1 找到生成的OOPS消息并使用ksymoops or 2 尝试使用 kgdb 进行远程调试 我正
  • JOptionPane 每行有多个按钮?

    我将如何展示JOptionPane showinputDialog 与多个JButtons每行 我不是在谈论Yes No Cancel按钮但有多个自定义标签JButtons显示在内容区域JOptionPane showinputDialog
  • UWP:如何获取任务栏高度

    我正在制作一个 UWP 应用程序 我的要求是以编程方式获取任务栏的大小 该应用程序将在不同分辨率的平板电脑上运行 在遵循 stackoverflow 上的许多答案 实际上与隐藏 显示任务栏更相关 之后 我得到了这个 如何获取任务栏的位置和大
  • unordered_map::iterator 从哪里来?

    当我使用std unordered map
  • 获取保存在挂钩函数中的订单项元中的自定义字段值

    我可以在产品页面上添加 验证 显示在购物车和结帐页面上的自定义字段 请有人告诉我如何使用以下命令检索自定义字段值woocommerce order status completed 已完成 hook 我想在确认电子邮件发送给用户后再发送一封
  • 使用 Weblogic 10.3 记录 JPA SQL

    通过查看 Open JPA 网站 我发现我可以使用以下命令记录生成的 SQL
  • 什么是“Microsoft C++ 异常”?

    这主要是出于好奇 但在调试时 我经常看到这样的一行 MyApp exe 中 0x7583812f 处的第一次机会异常 Microsoft C 异常 内存位置 0x039be09c 处的 CTBadSupportFileException 我
  • 将包含毫秒的 CIM_DateTime 解析为 Java 日期

    我正在尝试将从 Windows 管理界面检索到的 DateTime 值转换为 Java 1 7 日期 最终到纪元以来的毫秒数 这格式在这里指定 我试图解析的一个例子是20160513072950 782000 420这是 2016 年 5
  • WPF实时渲染

    我正在设计一款游戏 并考虑使用 WPF 制作基本游戏玩法的简单原型 是否可以在 WPF 中实时渲染基本的 2d 图形 我所说的基本图形是指简单的形状 如直线 圆形等 我所说的 实时 是指根据速度 加速度等参数进行渲染 这些参数根据玩家输入而
  • zip 函数还需要第二个列表,它如何仅使用一个参数列表

    我开始学习 Haskell 并发现了一个很好的练习 如下 grouping Int gt Student gt Team Student grouping teamNumber zip ys where 所以 练习要我尽量把剩下的填满 该函
  • 友好网址中西里尔字符的问题

    事情是这样的 我有友好的网址 例如 http site com blog read http site com blog read green apple 最后一段实际上是博客文章的友好标题 问题是当我尝试将该段传递到数据库时 西里尔字体变
  • 获取 JEditorPane 中的可见文本

    我在 JScrollPane 中有一个 JeditorPane 在应用程序中的某些点 我想检索滚动窗格中可见的文本 当前显示的文本 并且仅检索此文本 有没有办法做到这一点 谢谢你 Elliott 您可以使用视口来获取视图位置和大小 JVie
  • 我可以从 MySQL sql 文件生成 ruby​​ on Rails 数据库迁移文件吗

    我有一个 sql 脚本文件 导入后会在 MySQL 数据库中创建一个表并用 2800 条记录填充它 这些是比利时国家的所有邮政编码 现在我想由此制作一个 Ruby on Rails 数据库迁移文件 知道我该怎么做吗 也许有办法解决 告诉数据
  • 在 SQL 中获取 iso 周和年的日期

    从iso周和一年开始 我想得到一个约会 该日期应该是一周的第一天 一周的第一天是星期一 例如 iso 第 10 周和 iso 年应转换为 2019 03 04 我正在使用雪花 执行此操作的日期表达式有点复杂 但并非不可能 SELECT DA
  • Beautiful Soup:从

    我正试图从中剔除过生日的人维基百科页面 这是现有的代码 hdr User Agent Mozilla 5 0 site http en wikipedia org wiki january 1 req urllib2 Request sit
  • 使用 nodejs app.get 或 http-server 的“主线程上的同步 XMLHttpRequest 已被弃用”

    我正在 AngularJS 中为 Node js 中的后端创建一个前端 我可以选择使用两个简单的 Node js 前端服务器来为前端网页提供服务 一个是 Express 中的简单 app get 另一个是使用 http server 包 无
  • 为什么我需要一个函数式接口来使用 lambda?

    我认为这个问题已经存在于某处 但我无法找到它 我不明白为什么需要一个函数式接口来使用 lambda 考虑以下示例 public class Test public static void main String args TestInter