为什么通过Interface.super调用超接口方法?

时间:2018-08-21 21:36:55

标签: java

在Java中扩展类时,可以通过super引用来引用基类的成员。但是,当您拥有一个类A,那个implements和接口B时,您只能以B的方式引用B.super.method()的方法。为什么在第二种情况下,super关键字必须以B.为前缀?

示例:

interface Runner {
    default void run() {
        System.out.println("default Runner::run");
    }
}

static class RunnerImpl implements Runner {
    public void run() {
        Runner.super.run(); // doesn't work without "Runner."
    }
}

2 个答案:

答案 0 :(得分:9)

因为接口允许多重继承,这对于相同的方法可能造成歧义:

interface Runner1 {
    default void run() {
        System.out.println("default Runner1::run");
    }
}

interface Runner2 {
    default void run() {
        System.out.println("default Runner2::run");
    }
}

static class RunnerImpl implements Runner1, Runner2 {
    public void run() {
        super.run(); // which one???
    }
}

答案 1 :(得分:6)

因为super.xyz()在超类中查找(除了Object之外您没有),而Type.super.xyz()将在15.12.1. Compile-Time Step 1: Determine Class or Interface to Search中定义一个类或接口。 :

  

如果格式为super . [TypeArguments] Identifier,则要搜索的类是其声明包含方法调用的类的超类。

注意,未提及任何界面。

  

如果表单为TypeName . super . [TypeArguments] Identifier,则:

     

[...]

     

否则,TypeName表示要搜索的接口I。