Überladener Methodenaufruf: Priorisierung realer Parametertypen
Der Methodenüberladungsmechanismus von Java wählt die am besten geeignete Implementierung basierend auf den deklarierten Parametertypen aus. Ein weit verbreitetes Missverständnis besteht jedoch darin, dass bei der Überlastungsauflösung auch die tatsächlichen Typen berücksichtigt werden.
Die Herausforderung
Bedenken Sie den folgenden Codeausschnitt:
interface Callee { public void foo(Object o); public void foo(String s); public void foo(Integer i); } class CalleeImpl implements Callee { public void foo(Object o) { logger.debug("foo(Object o)"); } public void foo(String s) { logger.debug("foo(\"" + s + "\")"); } public void foo(Integer i) { logger.debug("foo(" + i + ")"); } } Callee callee = new CalleeImpl(); Object i = new Integer(12); Object s = "foobar"; Object o = new Object(); callee.foo(i); callee.foo(s); callee.foo(o);
Bei der Ausführung gibt dieser Code unerwartet dreimal „foo(Object o)“ aus, anstatt unterschiedliche Implementierungen basierend auf dem tatsächlichen Parameter auszuwählen Typen.
Die Grundursache
In Java wird der Methodenaufruf dynamisch für das Objekt ausgelöst, für das die Methode aufgerufen wird, nicht jedoch für die Parametertypen. In der Java-Sprachspezifikation heißt es ausdrücklich, dass die „Typen der Argumente zur Kompilierungszeit“ die ausgewählte Methodensignatur bestimmen.
Daher überschreiben die Parameterdeklarationen alle potenziellen Typkonvertierungen oder -heraufstufungen, die während der Parameterzuweisung erfolgen. Infolgedessen werden alle drei Aufrufe im bereitgestellten Code in die Methode „foo(Object o)“ aufgelöst, da Object der deklarierte Typ aller drei Parameter ist.
Auflösung
Um dieses Problem zu beheben und echte Parametertypen bei der Überlastungsauflösung zu priorisieren, ziehen Sie die folgenden Strategien in Betracht:
Das obige ist der detaillierte Inhalt vonWie geht das Überladen von Java-Methoden mit realen Parametertypen im Vergleich zu deklarierten Typen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!