Załóżmy, że istnieją dwa interfejsy: Interface1
i Interface2
, gdzie Interface2
rozszerza się o .Domyślne metody i interfejsy rozszerzające inne interfejsy
interface Interface1 {
default void method() {
System.out.println("1");
}
// Other methods
}
interface Interface2 extends Interface1 {
@Override
default void method() {
System.out.println("2");
}
// Other methods
}
Załóżmy, że chcemy utworzyć klasę, która implementuje Interface2
ale chcę method()
być wersja w Interface1
. Jeśli piszę
class MyClass implements Interface1, Interface2 {
public void method() {
Interface1.super.method();
}
}
pojawia się błąd kompilacji:
bad type qualifier in default super call: redundant interface Interface1 is extended by Interface2
To jest możliwe, aby obejść ten problem, tworząc trzeci interfejs:
interface Interface3 extends Interface1 {
default void method() {
Interface1.super.method();
}
}
wówczas:
class MyClass implements Interface1, Interface2, Interface3 {
public void method() {
Interface3.super.method();
}
}
To kompiluje się dobrze, a jeśli ja w Stantiate nowego MyClass
i wywołaj method()
, wyjście jest zgodnie z oczekiwaniami 1
.
Moje pytanie brzmi, biorąc pod uwagę, że tak łatwo jest obejść ograniczenie, że można napisać tylko InterfaceName.super.method()
dla najbardziej konkretnego interfejsu w łańcuchu, jaki jest powód ograniczenia? W jaki sposób zapobiega się problemom, uniemożliwiając pisanie Interface1.super.method()
w pierwszej kolejności?
Jeśli 'Interface2 rozciąga Interface1', w których scenariusz chcesz klasą je realizować zarówno * *? – Maroun
@MarounMaroun Masz rację, nie ma sensu pisać ich obu. Po prostu na IntelliJ dostałem mniej pomocny komunikat o błędzie, jeśli napisałem tylko "Interface2". –
metody w 'interfejsach' mają ciało, zgaduję, że muszę zrewidować moje podstawy. Sądzę, że mają być abstrakcyjne. –