显示调用Java的缺省方法| Java Debug 笔记

132 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:显示调用Java的缺省方法

Java 8引入了缺省方法,可以在不需要修改现有的接口的实现的情况下,来提供接口扩展的功能。

我想知道有没有可能显式地调用缺省方法的实现,当该方法已经被重写或者由于接口中不同的缺省方法的实现产生冲突而导致不可用的时候。

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // 这里怎么样调用 A.foo()?
    }
}

回答一

下面的代码应该能行:

public class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    void aFoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
        B b = new B();
        b.foo();
        b.aFoo();
    }
}

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

输出:

B.foo
A.foo

回答二

这个答案主要是问题45047550(这个问题已经关闭了)里面的用户的写的。

Java 8接口引入了一些关于多重继承方面的东西。缺省方法有一个已实现的函数体。要从父类调用方法,你可以使用关键字super,但如果你想用一个父类接口来实现这一点,就需要显式地给它命名。

class ParentClass {
    public void hello() {
        System.out.println("Hello ParentClass!");
    }
}

interface InterfaceFoo {
    public default void hello() {
        System.out.println("Hello InterfaceFoo!");
    }
}

interface InterfaceBar {
    public default void hello() {
        System.out.println("Hello InterfaceBar!");
    }
}

public class Example extends ParentClass implements InterfaceFoo, InterfaceBar {
    public void hello() {
        super.hello(); // (注意: 父类.super 不能被使用)
        InterfaceFoo.super.hello();
        InterfaceBar.super.hello();
    }
    
    public static void main(String[] args) {
        new Example().hello();
    }
}

输出:

Hello ParentClass!
Hello InterfaceFoo!
Hello InterfaceBar!

文章翻译自Stack Overflow:stackoverflow.com/questions/1…