具有多个方法的接口的Lambda表达式

时间:2014-05-23 17:16:16

标签: java lambda

使用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)

1 个答案:

答案 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 {}