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

随处可见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 {}

以上是 Lambda表达式用于多种方法的接口 的全部内容, 来源链接: utcz.com/qa/411600.html

回到顶部