Coder-Man
Coder-Man

Reputation: 2531

Why is a method of superinterface called through Interface.super?

When you extend a class in Java you can refer to base class' members through the super reference. However when you have a class A, that implements and interface B, you can only refer to B's methods in this way B.super.method(). Why does the super keyword in the second case have to be prefixed with B.?

Example:

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."
    }
}

Upvotes: 7

Views: 835

Answers (2)

Progman
Progman

Reputation: 19546

Because super.xyz() looks in the superclass (which you don't have, besides Object) and Type.super.xyz() will look for a class or interface, as defined in 15.12.1. Compile-Time Step 1: Determine Class or Interface to Search:

If the form is super . [TypeArguments] Identifier, then the class to search is the superclass of the class whose declaration contains the method invocation.

Notice, no interface mentioned.

If the form is TypeName . super . [TypeArguments] Identifier, then:

[...]

Otherwise, TypeName denotes the interface to be searched, I.

Upvotes: 5

shmosel
shmosel

Reputation: 50716

Because interfaces allow multiple inheritance, which can result in ambiguity for identical methods:

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???
    }
}

Upvotes: 13

Related Questions