【问题标题】: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 实现另一个方法?
【发布时间】:2020-07-10 19:02:17
【问题描述】:

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

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

答案是,为了创建一个有效的实现,您需要能够一次传递 N 个 lambda,这会带来很多歧义并大大降低可读性。

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

这是myInterface接口

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

并像我们通常做的那样实现一个函数,另一个作为 lambda 表达式实现

这是Lambda

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 实现另一个剩余的方法。它与代码质量和可维护性有关吗?谁能解释我无法理解它?如果可能,请举个例子。

【问题讨论】:

  • 对于接口中的方法使用publicabstract 是不必要的,因此建议避免使用。您在 main 方法中传递的 lambda 与 Lambda 类根本没有关系,因此您的问题没有多大意义。无论如何,规范说一个功能接口不能有多个抽象方法。因此,规范不能使用具有两个抽象方法的接口。

标签: java lambda functional-interface


【解决方案1】:

您可以创建MyInterface 的子接口,其中除了一种方法外,所有方法都使用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));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多