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

问题描述 投票:2回答:2

我有一个功能接口,它包含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表达式覆盖此默认方法。

谢谢

java lambda java-8 functional-programming functional-interface
2个回答
2
投票

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

当你这样做

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

您实现该方法,但不覆盖任何默认方法。

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

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

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

2
投票

你不能。 Java中的Lambda表达式只能用于具有单个抽象方法的接口(在本例中为printName),并将用作此抽象方法的实现。请注意,MyFunctionalInterface的任何实例都需要实现printName;如果你的lambda被用于printDetails2,你想从哪里来?

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

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

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

(在此上下文中“必须”:当您想要在适当位置创建它并分配给变量时。)

© www.soinside.com 2019 - 2024. All rights reserved.