[英]why we can't implement methods from interface to abstract class, without modifying “public”?
[英]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.