我有一个功能接口,它包含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表达式覆盖此默认方法。
谢谢
@FunctionalInterface
意味着您只有一种方法可以实现。
当你这样做
MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im
overriding default method");
您实现该方法,但不覆盖任何默认方法。
要覆盖默认方法,您必须创建一个实现接口的类并覆盖其中的方法。
public class MyClass implements MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
}
你不能。 Java中的Lambda表达式只能用于具有单个抽象方法的接口(在本例中为printName
),并将用作此抽象方法的实现。请注意,MyFunctionalInterface
的任何实例都需要实现printName
;如果你的lambda被用于printDetails2
,你想从哪里来?
如果要实现任何默认方法,则必须使用匿名类:
MyFunctionalInterface myFunctionalInterface1 = new MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
};
(在此上下文中“必须”:当您想要在适当位置创建它并分配给变量时。)