Powiedzmy, istnieją następujące typy:Java 8 domyślna metoda dziedziczenie
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();
}
}
W tym scenariuszu, jeśli main
jest wykonywany, „cześć z foo” jest drukowana. Dlaczego implementacja Foo
ma pierwszeństwo? Czy Bar
nie dziedziczy sayHi()
od Base
, ponieważ jeśli MyClass
miałaby zaimplementować tylko Bar
, implementacja Base
byłaby wywoływana? Więc sensowne byłoby, aby kod nadal się nie kompilował. Ponadto, ponieważ Bar
powinien mieć wdrożenie Base
„s sayHi()
, dlaczego nie mogę zastąpić go MyClass
jak:
@Override
public void sayHi() {
Bar.super.sayHi();
}
następujący błąd występuje, gdy próbuje zrobić:
zły typ kwalifikatora Bar w domyślnej metodzie super-wywołania, sayHi() jest nadpisywane w Foo
@Casey Z jakiego IDE korzystasz? Eclipse daje kolejny błąd. –
@JornVernee To było z IntelliJ. Jakie są wyniki Eclipse? – Casey
@ Casey '' 'Niedozwolone odwołanie do super metody sayHi() z typu Base, nie można pominąć bardziej konkretnego zastąpienia typu Foo' '' –