无法使用Lambda表达式覆盖接口的默认方法

时间:2019-02-19 11:39:25

标签: java lambda java-8 functional-programming functional-interface

我有一个功能接口,其中包含1个静态方法,1个默认方法和1个非静态抽象公共方法,如下所示:-

package com.lambda;

@FunctionalInterface
public interface MyFunctionalInterface {

    static void printDetails(){
       System.out.println("Im a static method");
    }

    default void printDetails2(){
        System.out.println("I'm in default method");
    }

    void printName();

}

从另一个类,使用Lambda表达式,我试图像下面这样调用和覆盖这些方法:-

package com.lambda;

public class Example1 {

    public static void main(String[] args) {
        //static method call
        MyFunctionalInterface.printDetails();

        //Lambda expression call to an abstract method
        MyFunctionalInterface myFunctionalInterface = () -> System.out.println("My name is Vinod Kumar Nair");
        myFunctionalInterface.printName();

        //Lambda expression call to a default method
        MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im overriding default method");
        myFunctionalInterface1.printDetails2();



    }
}

这是输出,我得到:-

Im a static method

My name is Vinod Kumar Nair

I'm in default method

使用Lambda表达式,我可以调用名为'printDetails'的静态方法。我还可以使用实现逻辑覆盖“ printName()”,其中将打印“我的名字是Vinod Kumar Nair”。

问题是我无法在实现中覆盖默认方法printDetails2()。我没有得到“我覆盖默认方法”的输出。我仍在使用默认的实现逻辑。

使用Lambda表达式覆盖默认方法是否存在任何问题。如果是,那么您可以告诉我如何使用Lambda表达式覆盖此默认方法。

谢谢

2 个答案:

答案 0 :(得分:2)

不能。 Java中的Lambda表达式只能用于具有单个抽象方法(在这种情况下为printName)的接口,并将用作该抽象方法的实现。请注意,MyFunctionalInterface的任何实例都需要实现printName;如果您的lambda用于printDetails2,您希望它从哪里来?

如果要实现任何默认方法,则必须使用匿名类:

MyFunctionalInterface myFunctionalInterface1 = new MyFunctionalInterface {
    @Override 
    void printDetails2() { ... }

    @Override 
    void printName() { ... }
};

(在这种情况下为“必须”:当您要就地创建它并分配给变量时。)

答案 1 :(得分:2)

@FunctionalInterface意味着您只有一种方法可以实现。

完成时

 MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im 
overriding default method");

您实现了方法,但没有覆盖任何默认方法。

要覆盖默认方法,您必须创建一个实现接口并在其中覆盖方法的类。

public class MyClass implements MyFunctionalInterface {
    @Override 
    void printDetails2() { ... }

    @Override 
    void printName() { ... }
}