内部接口方法从Java中的lambda表达式调用

时间:2015-03-16 18:35:58

标签: java interface lambda

现在我正在学习Java,我编写了这样的代码:

public class LambdaClass {
    public static void main(String args[]) {
        Plane pl = () -> {
            System.out.println("The plane is flying...");
        };

        pl.fly();
    }

    interface Plane {
       void fly();
       //void speedUp(); if I uncomment this, it is an error
    }
}

我感兴趣的是lambda表达式和Plane接口方法之间的联系是什么,我的意思是lambda表达式的body语句现在分配给了pl实例的fly方法,为什么会这样呢?

2 个答案:

答案 0 :(得分:2)

使用接口的lambda实现的一个要求是接口功能,即只有一个方法。

当您使用单个方法fly()定义接口时,Java认为它是有效的,并允许您使用lambda实现它。但是,添加第二个方法后,使用lambdas变得不可能,因为编译器需要知道您希望实现的两种方法中的哪一种。

解决此问题的一种方法是为每个方法定义单独的functionali接口,然后将它们组合成更大的接口,如下所示:

interface Flyable {
    void fly();
}
interface WithSpeedIncrease {
    void speedUp();
}
interface WithSpeedDecrease {
    void slowDown();
}
interface Plane extends Flyable, WithSpeedIncrease, WithSpeedDecrease {
}

答案 1 :(得分:0)

Lambda表达式替代实现功能接口的匿名内部类。

functional interface是一个只有一个非默认方法的接口,例如Plane接口。

你的lambda表达式等同于一个匿名内部类,它使用lambda表达式实现该接口的方法。

public static void main(String args[]) {
    Plane pl = new Plane() {
       @Override
       public void fly() {
           System.out.println("The plane is flying...");
       }
    };

    pl.fly();
}

lambda表达式更加简洁。

如果取消注释接口中的第二种方法,它不会编译的原因是它将不再是一个功能接口。 lambda表达式只能为一个方法提供隐含的方法体。如果接口中有2个方法,那么编译器就不会有第二个方法的实现,更不用说能够在等效方法之间进行选择。