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