Nehmen wir an, ich habe eine ComponentBase
Klasse, die ein Kind ObjectContextDecorator
und ein Enkel von ist ObjectContext
.
public class ComponentBase extends ObjectContextDecorator {
}
public class ObjectContextDecorator extends ObjectContext {
public void set(String objectTypePath, String characteristicName, Object value) {
//...
}
}
public class ObjectContext {
public void set(String characteristicName, Object value, boolean forced) {
//...
}
}
Die set
Methoden auf ObjectContextDecorator
und ObjectContext
sind sehr ähnlich. Betrachten Sie diesen Beispielcode:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
Die Signaturen beider Methoden passen zu der, die korrekt aufgerufen wird. Ich kann die Signaturen der Methoden nicht ändern, da dies nicht mein Code ist.
Woher weiß der Compiler, welche Methode ich aufrufen wollte?
Ich weiß, dass Sie in der IDE angeben können, welche Methode Sie tatsächlich aufrufen möchten, aber in dieser Situation verwende ich einen Klassenlader, um eine Klasse zu laden, deren Methode den Beispielcode enthält.
java
overloading
method-signature
Gabriel Robaina
quelle
quelle
String, String, boolean
. Die spezifischste Methode wird aufgerufen. Das ist alles in der JLS."this"
)Antworten:
Es prüft nach den Argumenten und bestimmt, welches spezifischer ist, gemäß den in JLS §15.2 beschriebenen Regeln
In Ihrem Fall ist der Anruf:
die Argumente
String
,String
,boolean
Welches der ersten Klasse entspricht ( Parameternamen wurden der Kürze halber geändert )
Die zweite Klasse wird nicht aufgerufen, da der dritte Parameter ein
Object
:und während der boolesche Wert
true
übereinstimmen kann, wenn er autoboxed ist, ist der erste spezifischer. Die hier geltende Regel lautet:Wenn Sie beispielsweise den Objekt-Wrapper
Boolean
in der Signatur verwenden:Dann stimmen beide überein, und der Compiler teilt Ihnen die folgende Meldung mit:
In Ihrem Beispiel ist dies jedoch nicht der Fall.
quelle
Dies alles wird in den JLS §15.2 Methodenaufrufausdrücken erläutert . Hier erfahren Sie alles darüber, wie die richtige Methode zum Aufrufen ausgewählt wird. Und beachten Sie, dass dies nicht immer erfolgreich ist.
In Ihrem speziellen Fall handelt es sich bei den beiden Methoden um gegenseitige Überladungen. Daher gilt §15.2.2 "Kompilierungszeit Schritt 2: Bestimmen der Methodensignatur" - welche aufzurufende Überlastung zur Kompilierungszeit bestimmt wird. Dieser Schritt ist weiter in 3 Phasen unterteilt.
In der ersten Phase versucht der Compiler, geeignete Methoden zu finden, ohne Box-Konvertierungen zuzulassen. In Ihrem Fall ist zum Aufrufen der Überlastung, die eine benötigt
Object
, eine Boxkonvertierung erforderlich, um dieboolean
true
in den Typ zu konvertierenObject
, damit in der ersten Phase keine Überlastung ausgewählt wird.Nun, wir haben genau eine Methode gefunden, also werden wir nur diese Methode wählen. Es gibt keine Mehrdeutigkeit.
quelle