【发布时间】: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