Heim > Java > javaLernprogramm > Berücksichtigt das Überladen von Java-Methoden Laufzeitparametertypen oder nur zur Kompilierungszeit deklarierte Typen?

Berücksichtigt das Überladen von Java-Methoden Laufzeitparametertypen oder nur zur Kompilierungszeit deklarierte Typen?

Barbara Streisand
Freigeben: 2024-12-31 18:55:10
Original
1008 Leute haben es durchsucht

Does Java Method Overloading Consider Runtime Parameter Types or Only Compile-Time Declared Types?

Überladende Methodenauswahl: Reale vs. deklarierte Parametertypen

In der Java-Programmierung bieten überladene Methoden die Flexibilität, mehrere Methoden mit denselben zu definieren Namen, aber unterschiedliche Parameterlisten. Wenn eine Methode aufgerufen wird, bestimmt der Compiler anhand der bereitgestellten Argumentliste die geeignete aufzurufende Methode.

In bestimmten Szenarien fragen Sie sich jedoch möglicherweise, ob bei der Methodenauswahl stattdessen der tatsächliche (Laufzeit-)Typ des Parameters berücksichtigt wird des deklarierten Typs. Betrachten Sie den folgenden Code:

interface Callee {
    void foo(Object o);
    void foo(String s);
    void foo(Integer i);
}

class CalleeImpl implements Callee {
    @Override
    public void foo(Object o) { System.out.println("foo(Object o)"); }
    @Override
    public void foo(String s) { System.out.println("foo(\"" + s + "\")"); }
    @Override
    public void foo(Integer i) { System.out.println("foo(" + i + ")"); }
}

public class Main {
    public static void main(String[] args) {
        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

Unerwartet gibt dieser Code „foo(Object o)“ für alle drei Aufrufe aus. Entgegen der Intuition berücksichtigt die Methodenauswahl nicht die tatsächlichen Parametertypen (Integer, String und Object). Stattdessen verlässt es sich ausschließlich auf die deklarierten Parametertypen in der Callee-Schnittstelle.

Dieses Verhalten ergibt sich aus der Java-Sprachspezifikation, in der ausdrücklich Folgendes angegeben ist:

When a method is invoked, the number of actual arguments and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked.
Nach dem Login kopieren

Daher ist es wichtig zu beachten dass in Java der dynamische Methodenversand, bei dem die tatsächlich aufzurufende Methode zur Laufzeit basierend auf dem Objekt bestimmt wird, für das sie aufgerufen wird, nur für das Objekt selbst gilt, nicht für die Parametertypen.

Das obige ist der detaillierte Inhalt vonBerücksichtigt das Überladen von Java-Methoden Laufzeitparametertypen oder nur zur Kompilierungszeit deklarierte Typen?. 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