繁体   English   中英

当我们在一个接口中添加两个抽象方法并只实现一个方法时,为什么我们不能使用 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 的相关问题。 这就是我得到的。 类似的问题

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

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

这是myInterface接口

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

并像我们通常做的那样实现了一个 function 和另一个 lambda 表达式

这是Lambda class

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关键字实现,但只有一种方法。 如果他们不提供自己的实现,它允许您提供接口实现者“继承”的默认实现。 因此,具有默认实现的方法不再是抽象的。 如果您在 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));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM