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

Lambda表达式用于多种方法的接口

伏砚
2023-03-14
问题内容

随处可见Java 8 lambda。当我向接口添加其他方法时,为什么这会给我一个错误:

      interface Something {
  public String doit(Integer i);
  public int getID(String name);.....

        Something s = (Integer i) -> {
        return i.toString();
    };
    System.out.println(s.doit(4));

    Something y = (Integer i) -> {
        return "do nothing";
    };
    System.out.println(y.doit(4));

在没有第二种方法的情况下可以正常工作:“ public int getID(String name)


问题答案:

Java lambda和方法引用只能分配给 功能接口 。从Java SE 8
API中,java.util.function软件包描述:

每个函数接口都有一个单一的抽象方法,称为该函数接口的函数方法,lambda表达式的参数和返回类型与之匹配或适配。功能接口可以在多个上下文中提供目标类型,例如分配上下文,方法调用或强制转换上下文:

JLS
9.8
也对此进行了讨论:

功能接口是仅具有一个抽象方法(除Object的方法之外)的接口,因此表示单个功能协定。这种“单一”方法可以采取多种抽象方法的形式,这些抽象方法具有从超级接口继承的等效等效签名。在这种情况下,继承的方法在逻辑上表示单个方法。

对于接口I,令M为抽象方法的集合,这些抽象方法是I的成员,这些签名与类Object的任何公共实例方法没有相同的签名。然后,如果M中存在满足以下两个条件的方法m,则我是一个功能接口:

  • m的签名是M中每个方法的签名的子签名(第8.4.2节)。

  • 对于M中的每个方法,m是可返回类型可替换的(第8.4.5节)。

除了通过声明和实例化类来创建接口实例的常规过程(第15.9节)之外,还可以使用方法引用表达式和lambda表达式(第15.13节,第15.27节)创建功能接口的实例。

泛型会产生一个有趣的效果:

在以下接口层次结构中,Z 是功能性接口 [强调我的],因为Z
继承了两个非Object成员的抽象方法,但它们具有相同的签名,因此继承的方法在逻辑上表示单个方法:

interface X { int m(Iterable<String> arg); }
interface Y { int m(Iterable<String> arg); }
interface Z extends X, Y {}


 类似资料:
  • 用Java 8 lambdas到处乱搞。为什么当我向接口添加另一个方法时,这会给我一个错误: 不使用第二个方法也能正常工作:“public int getID(String name)

  • 问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • IntelliJ一直建议我用方法引用替换我的lambda表达式。 两者之间有什么客观差异吗?

  • 问题内容: 我正在通过Java 8中的lambda表达式 当我更改线程代码时,它工作正常 转换为lambda表达式为 但是我无法转换FilenameFilter表达式 并成功转换为 它给错误,如日食 这行有多个标记 -语法错误,请插入“;” 完成语句 -语法错误,插入“}”以完成Block- 语法错误,插入“ AssignmentOperator Expression”以完成分配 问题答案: 首先

  • 它不编译。它在lambda表达式中显示错误: “目标方法是泛型的” 好的,当我使用编译它时,它显示了以下错误: