Herança de método padrão do Java 8
Digamos que existem os seguintes tipos:
public interface Base {
default void sayHi(){
System.out.println("hi from base");
}
}
public interface Foo extends Base {
@Override
default void sayHi(){
System.out.println("hi from foo");
}
}
public interface Bar extends Base {
}
public class MyClass implements Foo, Bar {
public static void main(String[] args) {
MyClass c = new MyClass();
c.sayHi();
}
}
Nesse cenário, semain
é executado, "hi from foo" é impresso. PorqueFoo
implementação tem precedência? NãoBar
herdarsayHi()
deBase
, pois seMyClass
era implementar apenasBar
, aBase
implementação seria chamada? Portanto, faria sentido que o código ainda não fosse compilado. Além disso, desdeBar
deveriaBase
implementação desayHi()
, por que não posso substituí-loMyClass
gostar:
@Override
public void sayHi() {
Bar.super.sayHi();
}
O seguinte erro ocorre ao tentar fazer isso:
qualificador de tipo ruim Bar no método padrão de super chamada, sayHi () é substituído no Foo