使用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));
Run Code Online (Sandbox Code Playgroud)
没有第二种方法可以正常工作:"public int getID(String name)
Java lambdas和方法引用只能分配给功能接口.从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 是一个功能接口 [强调我的]因为虽然它继承了两个不是Object成员的抽象方法,但它们具有相同的签名,因此继承的方法在逻辑上代表一个方法:
interface X { int m(Iterable<String> arg); }
interface Y { int m(Iterable<String> arg); }
interface Z extends X, Y {}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3177 次 |
最近记录: |