Heim > Java > javaLernprogramm > Wie geht das Überladen von Java-Methoden mit realen Parametertypen im Vergleich zu deklarierten Typen um?

Wie geht das Überladen von Java-Methoden mit realen Parametertypen im Vergleich zu deklarierten Typen um?

Mary-Kate Olsen
Freigeben: 2024-12-16 03:26:09
Original
536 Leute haben es durchsucht

How Does Java Method Overloading Handle Real Parameter Types vs. Declared Types?

Ü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);
Nach dem Login kopieren

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:

  • Verwenden Sie eine separate Methode Signaturen: Definieren Sie separate überladene Methoden mit bestimmten Parametertypen, anstatt sich auf die Objekttypumwandlung zu verlassen.
  • Erwägen Sie Generika: Nutzen Sie Generika, um typsichere überladene Methoden zu erstellen, die verschiedene Typen verarbeiten.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage