Möglicherweise kann Folgendes nicht ausgeführt werden (Ich bekomme einen Kompilierungsfehler: "Die vererbte Methode A.doSomthing (int) kann die öffentliche abstrakte Methode in B nicht ausblenden"):
public class A {
int doSomthing(int x) {
return x;
}
}
public interface B {
int doSomthing(int x);
}
public class C extends A implements B {
//trying to override doSomthing...
int doSomthing(int x) {
return doSomthingElse(x);
}
}
Angenommen, ich darf weder A noch B ändern. Meine Frage ist, ob ich C irgendwie so definieren kann, dass es sowohl von A als auch von B erbt und B).
Oder wenn nicht, wie würden Sie das umgehen?
Vielen Dank!
machen Sie die Methode öffentlich
public class C extends A implements B {
//trying to override doSomthing...
public int myMethod(int x) {
return doSomthingElse(x);
}
}
schnittstellenmethoden sind immer public
oder verwenden Sie einfach Komposition statt Vererbung
Die Methode doSomethis()
lautet package-private in Klasse A:
public class A {
int doSomthing(int x) { // this is package-private
return x;
}
}
Aber es ist public in der Schnittstelle B:
public interface B {
int doSomthing(int x); // this here is public by default
}
Der Compiler nimmt das von C vererbte doSomething()
von A, das package-private ist, als Implementierung des in B verwendeten public. Deshalb beschwert es sich -
"Die vererbte Methode A.doSomthing (int) kann die öffentliche abstrakte Methode in B nicht ausblenden."
Denn während Überschreiben einer Methode können Sie Zugriffsebene der Methode nicht eingrenzen.
Lösung ist einfach in Klasse C -
@Override
public int doSomthing(int x) {
// ...
}
Das hat mit Sichtbarkeit zu tun. Sie verwenden default
(kein Modifikator) für C
für myMethod
, aber es muss public
entsprechend der Schnittstelle B
sein.
Nun könnten Sie denken, Sie haben die Sichtbarkeit von default
für alle verwendet, da Sie weder in A
, B
noch C
explizit eine der Optionen public
, private
oder protected
ausgewählt haben. Die Schnittstelle verwendet jedoch public
, unabhängig davon, ob Sie dies ausdrücklich angeben.
Wenn Sie die Methode in public
überschreiben, genügt es, die Methode C
zu erstellen.