GOOGLE ADS

Samstag, 23. April 2022

Eine Klasse, die dieselbe Methode von zwei verschiedenen Schnittstellen und einer einzelnen Standardimplementierung erbt, wird nicht kompiliert

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 Cso wie sie ist in Ordnung ist: Sie sollte implementieren method, weil dies der Vertrag von beiden ist Aund B, und das tut sie tatsächlich, weil sie Beine 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 nulldie Rückgabe von Werten zulässt, und die andere nicht. Wenn die Standardmethode für die erste Schnittstelle zurückgegeben nullwü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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...