无法使用 Lambda 表达式覆盖接口的默认方法
Unable to override a default method of an Interface using Lambda expression
我有一个功能接口,其中包含 1 个静态方法、1 个默认方法和 1 个非静态抽象 public 方法,如下所示:-
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();
}
从另一个 class,使用 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()',其中 'My name is Vinod Kumar Nair' 正在打印。
问题是我无法用我的实现覆盖默认方法 printDetails2()。我没有得到 'Im overriding default method' 的输出。我仍然在获取默认的实现逻辑。
使用 Lambda 表达式覆盖默认方法是否有任何问题。如果是,那么您可以告诉我如何使用 Lambda 表达式覆盖此默认方法。
谢谢
你不能。 Java 中的 Lambda 表达式只能用于具有单个抽象方法的接口(在本例中为 printName
),并将用作此抽象方法的实现。请注意,MyFunctionalInterface
的任何实例都需要实现 printName
;如果你的 lambda 用于 printDetails2
,你希望它从哪里来?
如果你想实现任何默认方法,你必须使用匿名 class:
MyFunctionalInterface myFunctionalInterface1 = new MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
};
("have to" 在这种情况下:当您想就地创建它并分配给变量时。)
@FunctionalInterface
表示你只有一种方法可以实现。
当你
MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im
overriding default method");
您实现了该方法,但未覆盖任何默认方法。
要覆盖默认方法,您必须创建一个 class 来实现您的接口并覆盖那里的方法。
public class MyClass implements MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
}
我有一个功能接口,其中包含 1 个静态方法、1 个默认方法和 1 个非静态抽象 public 方法,如下所示:-
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();
}
从另一个 class,使用 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()',其中 'My name is Vinod Kumar Nair' 正在打印。
问题是我无法用我的实现覆盖默认方法 printDetails2()。我没有得到 'Im overriding default method' 的输出。我仍然在获取默认的实现逻辑。
使用 Lambda 表达式覆盖默认方法是否有任何问题。如果是,那么您可以告诉我如何使用 Lambda 表达式覆盖此默认方法。
谢谢
你不能。 Java 中的 Lambda 表达式只能用于具有单个抽象方法的接口(在本例中为 printName
),并将用作此抽象方法的实现。请注意,MyFunctionalInterface
的任何实例都需要实现 printName
;如果你的 lambda 用于 printDetails2
,你希望它从哪里来?
如果你想实现任何默认方法,你必须使用匿名 class:
MyFunctionalInterface myFunctionalInterface1 = new MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
};
("have to" 在这种情况下:当您想就地创建它并分配给变量时。)
@FunctionalInterface
表示你只有一种方法可以实现。
当你
MyFunctionalInterface myFunctionalInterface1 = () -> System.out.println("Im
overriding default method");
您实现了该方法,但未覆盖任何默认方法。
要覆盖默认方法,您必须创建一个 class 来实现您的接口并覆盖那里的方法。
public class MyClass implements MyFunctionalInterface {
@Override
void printDetails2() { ... }
@Override
void printName() { ... }
}