Java 如何调用接口';重写实现中方法的默认实现?

Java 如何调用接口';重写实现中方法的默认实现?,java,default,Java,Default,假设我有以下代码: interface HumanoidForm { default HumanoidForm reproduce() { <appropriate code for humanoid form reproduction> } } class Android extends Machine implements HumanoidForm { public HumanoidForm reproduce() { &

假设我有以下代码:

interface HumanoidForm {
    default HumanoidForm reproduce() {
        <appropriate code for humanoid form reproduction>
    }
}

class Android extends Machine implements HumanoidForm {
    public HumanoidForm reproduce() {
        <appropriate code for android reproduction> // how to use HumanoidForm's default implementation here?
    }
}
界面人形{
默认类人形复制(){
}
}
类Android扩展机器实现类人表单{
公共类人型{
//这里如何使用HumanoidForm的默认实现?
}
}
现在假设“适用于android复制的代码”最好用“适用于仿人形体复制的代码”作为子程序来描述。如何从“android复制的适当代码”中访问“仿人表单的适当代码”?我可以想出三种方法,但都不管用:

  • 只需调用reproduct()即可调用重写实现。
  • 编写((HumanoidForm)this).repearch()仍然调用重写实现。
  • 通过重写方法模拟在超类中重复使用方法的实现,人们可能会想到编写super.repearch()。然而,这指的是机器实现的复制,这甚至可能不存在。
因此,似乎没有办法在默认方法中重新使用代码进行重写。真的是这样吗?

看看这个:

HumanoidForm.super.reproduce();
特别是在这一节中,它说“如果我们想特别调用InterfaceA或InterfaceB中的一个sayHi()方法,我们还可以执行以下操作:”

因此,似乎没有办法在默认方法中重新使用代码进行重写。真的是这样吗

HumanoidForm.super.reproduce();
不,您可以重用代码。您可以轻松地对其进行测试,您将看到以下代码可以正常工作:

public class Test implements HumanoidForm
{             
    public static void main(String[] args) 
    {       
        new Test().reproduce();         
    }   

    @Override
    public void reproduce(){
        HumanoidForm.super.reproduce();  //Invoking default method
        System.out.println("From implementing class");
    }       
}

interface HumanoidForm {
    default void reproduce() {
       System.out.println("From default interface");
    }
}
输出:

From default interface
From implementing class

实际上,您可以自由选择现有的实现。让我给你一个比你的稍微复杂一点的场景。更糟糕的是,所有
A
B
C
都有相同的方法签名

interface A {
    default void doWork() {
       System.out.println("Default implementation From A");
    }
}

interface B{
    default void doWork() {
      System.out.println("Default implementation From B");  
    }   
}

class C{
    void doWork(){
        System.out.println("Default implementation From C");
    }       
}
现在,我为C创建了一个子类,它实现了a&B:

class Tester extends C implements A, B
{
    @Override public void doWork(){
        A.super.doWork();  //Invoke A's implementation
        B.super.doWork();  //Invoke B's implementation
        super.doWork();    //Invoke C's implementation
    }
}

输出将是:

Default implementation From A
Default implementation From B
Default implementation From C
当你跑步时

new Tester().doWork();

我只是想说,你刚刚用接口的默认实现让我大吃一惊,我不知道你可以这么做。@Jin,这是一个相对较新的功能,可从Java 8获得。