通过 lambda 表达式实现具有两个抽象方法的接口

2022-09-01 09:28:33

在 Java 8 中,引入了 lambda 表达式来帮助减少样板代码。如果接口只有一种方法,则工作正常。如果它由多个方法组成,则没有一个方法有效。如何处理多种方法?

我们可以选择以下示例

public interface I1()
{
    void show1();
    void show2();
}

那么,在main本身中定义方法的main函数的结构是什么?


答案 1

Lambda 表达式只能与 Eran 所说的功能接口一起使用,但是如果您确实需要在接口中使用多个方法,则可以根据需要将修饰符更改为或在实现它们的类中重写它们。defaultstatic

public class Test {
    public static void main(String[] args) {
        I1 i1 = () -> System.out.println(); // NOT LEGAL
        I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
        I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
    }
}

interface I1 {
    void show1();
    void show2();
}

interface I2 {
    void show1();
    default void show2() {}
}

interface I3 {
    void show1();
    static void show2 () {}
}

遗产

您不应忘记继承的方法。

这里,继承并因此不能是功能接口。I2show1show2

public class Test {
    public static void main(String[] args) {
        I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
        I2 i2 = () -> System.out.println(); // NOT LEGAL
    }
}

interface I1 {
    void show1();
    void show2();
}

interface I2 extends I1 {
    void show3();
}

注解

要确保您的界面是功能性界面,您可以添加以下注释@FunctionalInterface

@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
    void show1();
    void show2();
}

@FunctionalInterface
interface I2 {
    void show3();
}

答案 2

Lambda 表达式只能用于实现功能接口,函数接口是具有单个抽象方法的接口。具有两个抽象方法的接口不能由 lambda 表达式实现。


推荐