Warum ist es nicht möglich, eine Funktion nur durch Ändern des Rückgabetyps zu überladen? Wird sich das in einer zukünftigen Version von Java ändern?
Ist dies übrigens nur als Referenz in C ++ möglich?
Warum ist es nicht möglich, eine Funktion nur durch Ändern des Rückgabetyps zu überladen? Wird sich das in einer zukünftigen Version von Java ändern?
Ist dies übrigens nur als Referenz in C ++ möglich?
Antworten:
Sie können es nicht in Java tun, und Sie können es nicht in C ++ tun. Das Grundprinzip ist, dass der Rückgabewert allein nicht ausreicht, damit der Compiler herausfindet, welche Funktion aufgerufen werden soll:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, es ist double
.
foo();
ohne einen Rückgabetyp mehrdeutig wäre, ist nicht unbedingt ein Grund, ihn als Überladung zu verbieten. Es gibt Argumente, die Mehrdeutigkeiten verursachen können (z. B. foo(null);
), die jedoch die Überladung nicht von Natur aus ungültig machen.
Der Grund dafür ist, dass Überladungen in Java nur für Methoden mit unterschiedlichen Signaturen zulässig sind .
Der Rückgabetyp ist nicht Teil der Methodensignatur und kann daher nicht zur Unterscheidung von Überladungen verwendet werden.
Siehe Definieren von Methoden in den Java-Tutorials.
calculateAnswer(double, int, double, double)
". Stellen Sie sicher, dass der Rückgabetyp @konmik nicht enthalten ist.
Vor Java 5.0 müssen beim Überschreiben einer Methode sowohl die Parameter als auch der Rückgabetyp genau übereinstimmen. In Java 5.0 wird eine neue Funktion namens kovarianter Rückgabetyp eingeführt. Sie können eine Methode mit derselben Signatur überschreiben, aber eine Unterklasse des zurückgegebenen Objekts zurückgeben. Mit anderen Worten, eine Methode in einer Unterklasse kann ein Objekt zurückgeben, dessen Typ eine Unterklasse des Typs ist, der von der Methode mit derselben Signatur in der Oberklasse zurückgegeben wird.
Overloaded
Methoden in Java können unterschiedliche Rückgabetypen haben, da das Argument ebenfalls unterschiedlich ist.
Überprüfen Sie den Beispielcode.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
Der Rückgabetyp spielt beim Überladen einer Methode keine Rolle. Wir müssen nur sicherstellen, dass es keine Unklarheiten gibt!
Die einzige Möglichkeit für Java, die aufzurufende Methode zu ermitteln, besteht darin, die Typen der Argumentliste zu unterscheiden. Wenn der Compiler zwei Methoden mit demselben Namen und denselben Argumenttypen zulässt, kann nicht festgelegt werden, welche Methode aufgerufen werden soll.
Der Compiler berücksichtigt bei der Unterscheidung von Methoden nicht den Rückgabetyp. Daher können Sie nicht zwei Methoden mit derselben Signatur deklarieren, selbst wenn sie einen anderen Rückgabetyp haben.
Wenn Sie sich der Funktionsausführung bewusst sind, werden Sie wissen, dass beim Aufrufen einer Funktion der Definitionsteil ausgeführt wird und wir schließlich die return-Anweisung benötigen. Daher können wir sagen, dass return nach der gesamten Definition der Funktion erfolgt. Deshalb, wenn es zwei oder gibt mehr Funktionen mit gleichem Namen und gleichem Typ und Nr. von Argumenten dann zum Zeitpunkt des Aufrufs, wie der Compiler weiß, welches aufgerufen werden soll, da Funktionsname und Parameter identisch sind. Zum Zeitpunkt des ersten Aufrufs liegt der Fokus auf Argumenten und Funktionsnamen, und nach Abschluss der Funktionsdefinition beschäftigen wir uns schließlich mit der return-Anweisung.
Der Kompilierungszeitfehler ist besser als der Laufzeitfehler. Der Java-Compiler gibt also einen Compiler-Zeitfehler aus, wenn Sie dieselbe Methode mit denselben Parametern deklarieren.
nein nicht wirklich möglich auf diese Weise können Sie nur durch keine Argumente oder Datentyp der Argumente überladen