Mehrere Interfaces in einer Java-Klasse - welche wird für Methodenaufrufe verwendet?

8

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?

    
Micheal Hill 26.03.2014, 23:59
quelle

5 Antworten

10

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 .

    
rgettman 27.03.2014, 00:07
quelle
6

Dies führt zu einem Kompilierzeitfehler.
"Die Methode doThings ist für den Typ D mehrdeutig"
Das ist deine Antwort.

%Vor%

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.

    
peter.petrov 27.03.2014 00:05
quelle
3

Es wird Ihnen einen Fehler bei der Kompilierung geben: "Die Methode doThings (A) ist für den Typ D nicht eindeutig".

Um das Problem zu beheben, anstatt

aufzurufen

doThings(new C());

Sie können

anrufen

doThings((A)new C());

oder

doThings((B)new C());

    
JackDev 27.03.2014 00:11
quelle
2

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.

    
Mohan 27.03.2014 00:06
quelle
2

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.

    
user1172468 27.03.2014 00:10
quelle

Tags und Links