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."
}
}
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???
}
}
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,
TypeNamedenotes the interface to be searched, I.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With