Ich bin auf ein seltsames Problem gestoßen, das mit Standardmethoden arbeitet.
Betrachten Sie diese Situation:
interface A {
int method();
}
interface B {
default int method() {
return 1;
}
}
class C implements A, B {
void anotherMethod() { }
}
Ich würde erwarten, dass die Klasse C
so wie sie ist in Ordnung ist: Sie sollte implementieren method
, weil dies der Vertrag von beiden ist A
und B
, und das tut sie tatsächlich, weil sie B
eine Standardimplementierung bereitstellt.
Der Compiler stimmt mir jedoch nicht zu und sagt:
C is not abstract and does not override abstract method method()
Ich kann das Problem in anderen ähnlichen Fällen, wie diesem, vollständig sehen, aber ich kann nicht herausfinden, was mit diesem Code falsch ist.
Lösung des Problems
Aus syntaktischer Sicht ist vielleicht nichts falsch, aber die Frage ist: Ist es sinnvoll, eine Standardmethode von Schnittstelle B zu haben, die die abstrakte Methode einer anderen, nicht verwandten Schnittstelle A überschreibt?
Stellen Sie sich vor, die beiden Schnittstellen stellten zwei verschiedene Möglichkeiten dar, einen Wert zu berechnen: eine, die null
die Rückgabe von Werten zulässt, und die andere nicht. Wenn die Standardmethode für die erste Schnittstelle zurückgegeben null
würde, würde dies den Vertrag der zweiten verletzen. Und wenn der Compiler die Vererbung in Klasse C zulässt, verletzt Klasse C effektiv einen der Verträge der implementierten Schnittstellen, was möglicherweise ohne die Aufmerksamkeit des Programmierers zu einem Fehler führt.
Beachten Sie, dass, wenn B eher eine Klasse als eine Schnittstelle wäre, es bei der Kompilierung kein Problem gibt, da das Problem des "gemischten Vertrags" in diesem Fall nicht vorhanden ist, da es nur eine Schnittstelle gibt.
Keine Kommentare:
Kommentar veröffentlichen