Diciamo che ci sono i seguenti tipi:Java metodo 8 di default eredità
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();
}
}
In questo scenario, se main
viene eseguito, "hi da foo" viene stampato. Perché l'implementazione di Foo
ha la precedenza? Non Bar
eredita sayHi()
da Base
, poiché se MyClass
dovesse implementare solo Bar
, l'implementazione Base
si chiamerebbe? Quindi avrebbe senso che il codice non si compilasse ancora. Inoltre, dal momento che Bar
dovrebbe avere implementazione Base
s' di sayHi()
, perché non posso ignorare che in MyClass
come:
@Override
public void sayHi() {
Bar.super.sayHi();
}
Il seguente errore si verifica quando si cerca di farlo:
male qualificatore di tipo Bar in metodo di default super-chiamata, sayHi() viene ignorato in Foo
@Casey Che IDE stai utilizzando? Eclipse dà un altro errore. –
@JornVernee Era di IntelliJ. Che cosa produce Eclipse? – Casey
@Casey '' 'Il riferimento illegale al metodo super sayHi() dal tipo Base, non può ignorare l'override più specifico di tipo Foo''' –