使用Java 8 lambdas进行修补。 当我向界面添加另一个方法时,为什么这会给我一个错误:
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)
答案 0 :(得分:5)
Java lambdas和方法引用只能分配给功能接口。从Java SE 8 API开始,java.util.function
package:
每个功能接口都有一个抽象方法,称为该功能接口的功能方法,lambda表达式的参数和返回类型与之匹配或匹配。功能接口可以在多个上下文中提供目标类型,例如赋值上下文,方法调用或强制转换上下文:
JLS 9.8也讨论了这个问题:
功能接口是一个只有一个抽象方法(除了Object的方法)的接口,因此代表一个单一的函数契约。这种“单一”方法可以采用多个抽象方法的形式,从超级接口继承的覆盖等效签名;在这种情况下,继承的方法在逻辑上代表一个方法。
对于接口I,让M是作为I的成员的抽象方法集合,它们与Object类的任何公共实例方法没有相同的签名。然后,如果在M中存在m方法m,则我是一个函数接口,其中以下两个都为真:
m的签名是M中每个方法签名的子签名(§8.4.2)。
m是M中每个方法的返回类型可替换(第8.4.5节)。
除了通过声明和实例化类(第15.9节)创建接口实例的常规过程之外,还可以使用方法引用表达式和lambda表达式(第15.13节,第15.27节)创建功能接口的实例。
泛型有趣的效果:
在以下接口层次结构中,Z 是一个功能接口 [强调我的]因为虽然它继承了两个不是Object成员的抽象方法,但它们具有相同的签名,因此逻辑上继承的方法代表一种方法:
interface X { int m(Iterable<String> arg); }
interface Y { int m(Iterable<String> arg); }
interface Z extends X, Y {}