【问题标题】:Unable to override a default method of an Interface using Lambda expression无法使用 Lambda 表达式覆盖接口的默认方法
【发布时间】:2019-07-12 21:52:05
【问题描述】:

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

谢谢

【问题讨论】:

  • 一个 lambda 表达式只能为函数接口的抽象方法提供实现。
  • "使用 Lambda 表达式,我可以调用名为 'printDetails' 的静态方法。"不,这里不涉及任何 lambda。
  • 相关的我可以调用名为'printDetails'的静态方法。我还可以用我的实现逻辑覆盖“printName()”.. 是的,您正在调用 printDetails 方法,但它的默认实现以及对于您的 lambda 表达式,您刚刚实现了抽象 printName方法。
  • 谢谢大家,我现在很清楚了。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    @FunctionalInterface 表示你只有一种方法可以实现。

    当你这样做时

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2018-03-14
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多