web-dev-qa-db-de.com

Überladung mit anderem Rückgabetyp in Java?

Warum ist es nicht möglich, eine Funktion nur durch Ändern des Rückgabetyps zu überladen? Wird sich dies in einer zukünftigen Java-Version ändern?

Ist dies übrigens nur in C++ möglich?

77
nunos

In Java ist dies nicht möglich, in C++ jedoch nicht. Der Grund ist, dass der Rückgabewert alleine nicht ausreicht, um herauszufinden, welche Funktion aufgerufen werden soll:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?
136

Der Grund 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 Methoden definieren aus den Java-Tutorials.

46
Oded

Wenn Sie vor Java 5.0 eine Methode überschreiben, müssen beide Parameter und 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, gibt jedoch eine Unterklasse des zurückgegebenen Objekts zurück. 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.

21

Overloaded-Methoden in Java können unterschiedliche Rückgabetypen haben, da das Argument auch anders 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");
    }

}
5
Abdullah Khan

Der Compiler berücksichtigt den Rückgabetyp nicht, wenn Methoden unterschieden werden. Sie können also nicht zwei Methoden mit derselben Signatur deklarieren, auch wenn sie einen anderen Rückgabetyp haben.

1
Ganesh

Der Rückgabetyp spielt beim Überladen einer Methode keine Rolle. Wir müssen nur sicherstellen, dass es keine Mehrdeutigkeiten gibt!

Die einzige Möglichkeit, mit der Java wissen kann, welche Methode aufgerufen werden soll, ist die Differenzierung der Typen der Argumentliste. Wenn der Compiler zwei Methoden mit demselben Namen und denselben Argumenttypen zulässt, gibt es keine Möglichkeit zu bestimmen, welche Methode er aufrufen soll.

1
Vinayak

Der Compiler berücksichtigt den Rückgabetyp nicht, wenn Methoden unterschieden werden. Sie können also nicht zwei Methoden mit derselben Signatur deklarieren, auch wenn sie einen anderen Rückgabetyp haben.

Wenn Sie sich der Funktionsausführung bewusst sind, werden Sie wissen, dass der Definitionsteil beim Aufruf einer Funktion ausgeführt wird und schließlich die return-Anweisung erforderlich ist. Daher können wir sagen, dass return nach der gesamten Definition der Funktion kommt. Deshalb gibt es zwei oder Weitere Funktionen mit gleichem Namen und gleichem Typ und Nr. Argumente dann zum Zeitpunkt des Aufrufs, wie Compiler wissen wird, welches Argument aufgerufen werden soll, da Funktionsname und Parameter identisch sind. Zum Zeitpunkt des Aufrufs liegt der Fokus auf Argumenten und Funktionsnamen, und nach Abschluss der Funktionsdefinition befassen wir uns mit der return-Anweisung.

Fehler beim Kompilieren ist besser als Laufzeitfehler. Der Java-Compiler gibt also einen Compiler-Zeitfehler aus, wenn Sie dieselbe Methode mit denselben Parametern deklarieren.

0
LearnAndHelp