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