Ü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); } }
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.
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!