当我们在接口中添加两个抽象方法并只实现一个方法时,为什么我们不能使用 lambda 实现另一个方法?

When we add two abstract methods in an interface and implement just one method then why can't we implement the other method using lambda?

我正在练习 lambda 函数,我所知道的是使用它们我们需要创建一个函数接口,它只包含一个未实现的抽象方法。

所以我想知道为什么 java 不允许多个抽象方法,即使它们具有不同的签名。所以我通读了 Stack Overflow 上的相关问题。这就是我得到的。

The answer would be that in order to create a valid implementation, you would need to be able to pass N lambdas at once and this would introduce a lot of ambiguity and a huge decrease in readability.

现在我做了一个小实验,我创建了一个接口,其中包含两个具有不同签名的已实现抽象方法。

这是myInterface界面

interface MyInterface {
    abstract void func();
    abstract void func(int i);
}

并像往常一样实现一个函数,另一个作为 lambda 表达式

这是Lambdaclass

class Lambda implements MyInterface{

    public void doWork(MyInterface myInterface) {
        myInterface.func();
    }
    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork( e -> System.out.println("func:" + e ));
    }

    @Override
    public void func() {
        System.out.println("func");
    }
    
}

显然这段代码不起作用。我只是不明白,即使我有两个不同的签名,即使其中一个是正常实现的,那为什么我们不能用 lambda 实现另一个剩余的方法。它与代码质量和可维护性有关吗?谁能解释我无法理解它?请尽可能举个例子。

您可以创建 MyInterface 的子接口,除了使用 default 关键字实现的一个方法外,其他所有方法都可以。它允许您提供 default 接口实现者“继承”的实现,如果他们不提供自己的实现的话。因此,具有默认实现的方法不再是抽象的。如果您有效地默认实现了 s 子接口中除一个接口之外的所有接口,那么您最终会得到一个功能接口(一个抽象方法接口)。这允许您使用 lambda 表达式。

interface PartialInterface extends MyInterface {
    @Override
    default void func() {
        System.out.println("func");
    }
}
class Lambda {
    public void doWork(PartialInterface myInterface) {
        // both methods from the interface can be used
        myInterface.func();    // the default implementation "inherited" from PartialInterface
        myInterface.func(42);  // the single abstract method (inherited by PartialInterface from myInterface) overridden by the lambda expression
    }

    public static void main(String[] args) {
        Lambda lambda = new Lambda();
        lambda.doWork(e -> System.out.println("func:" + e));
    }
}