Wenn ich eine Klasse habe, die zwei Interfaces implementiert, sende ich diese Klasse an eine überladene Methode, die beide Interfaces akzeptiert; Welche Variante der Methode wird aufgerufen?
Mit anderen Worten, wenn ich so etwas habe:
%Vor%Und ich sende meine Klasse C an die Methode / en in D:
%Vor%Welche Methode sollte aufgerufen werden? Bedeckt der Java-Standard das?
Sie erhalten einen Compilerfehler, weil mehrere Methoden übereinstimmen, nämlich beide doThings
Methoden.
Die JLS deckt dies ab, in Abschnitt 15.12 .2.5 . Es wird beschrieben, wie die Methode aufgelöst wird, die für einen Ausdruck gilt, der eine Methode aufruft.
Andernfalls sagen wir, dass der Methodenaufruf mehrdeutig ist und ein Fehler bei der Kompilierung auftritt.
Dies tritt auf, nachdem mehrere Methoden gefunden wurden, die übereinstimmen, eine Methode ist nicht "spezifischer" als eine andere und keine abstract
.
Dies führt zu einem Kompilierzeitfehler.
"Die Methode doThings ist für den Typ D mehrdeutig"
Das ist deine Antwort.
Hier ist der genaue Fehler:
%Vor% Beachten Sie, dass Sie x als AAA x = new C();
definieren
oder als BBB x = new C();
, dann kompiliert es OK. Jetzt
der Typ der x
-Referenz (AAA oder BBB) macht
Diese Version ist eindeutig.
Es ist ein compile time error
. Nicht einmal Laufzeit, ein Kompilierzeitfehler.
Dieser Link erklärt deutlich.
It is possible for a class to inherit more than one field with the same name. Such a situation does not in itself cause a compile-time error. However, any attempt within the body of the class to refer to any such field by its simple name will result in a compile-time error, because such a reference is ambiguous.
Genau das hast du versucht.
Ich stimme den Leuten zu, die behaupten, dass dies zu einem Java Compile Time Error führen wird.
Es ist wichtig zu beachten, dass Java eine statisch typisierte Sprache ist - was das für diesen Fall bedeutet, dass: welche Methoden aufgerufen werden (in diesem Fall) werden zur Kompilierzeit bestimmt.
Es gibt Ausnahmen von dieser Regel - zum Beispiel beim Methodenaufruf durch Reflektion.
Wenn also in diesem Fall der Compiler versucht, zu bestimmen, an welche Methode der Aufruf gebunden werden soll, wird er in eine mehrdeutige Situation gezwungen, was zu einem Kompilierzeitfehler führt.
Tags und Links java inheritance