Was ist ein kovarianter Rückgabetyp in Java? In der objektorientierten Programmierung im Allgemeinen?
java
oop
covariance
Pops
quelle
quelle
Antworten:
Kovariante Rückgabe bedeutet, dass beim Überschreiben einer Methode der Rückgabetyp der überschreibenden Methode ein Subtyp des Rückgabetyps der überschriebenen Methode sein darf.
Um dies anhand eines Beispiels zu verdeutlichen, ist ein häufiger Fall
Object.clone()
- der deklariert wird, einen Typ von zurückzugebenObject
. Sie können dies in Ihrer eigenen Klasse wie folgt überschreiben:Der Vorteil hierbei ist, dass jede Methode, die einen expliziten Verweis auf ein MyFoo-Objekt enthält, aufrufen
clone()
und (ohne Umwandlung) wissen kann, dass der Rückgabewert eine Instanz von istMyFoo
. Ohne kovariante Rückgabetypen müsste die überschriebene Methode in MyFoo für die Rückgabe deklariert werdenObject
- und daher müsste das Aufrufen von Code das Ergebnis des Methodenaufrufs explizit herabsetzen (obwohl beide Seiten "wissen", dass es immer nur eine Instanz von MyFoo sein kann ).Beachten Sie, dass es nichts Besonderes gibt
clone()
und dass jede überschriebene Methode eine kovariante Rückgabe haben kann. Ich habe sie hier als Beispiel verwendet, da es sich um eine Standardmethode handelt, bei der dies häufig nützlich ist.quelle
List<Foo>
und verwandt seinList<FooBar>
?clone()
als aMethod<Void, Object>
vorstellen und fragen, ob das spezifischereMethod<Void, MyFoo>
diesem übergeordneten Typ zuweisbar ist. Was es ist, wenn und nur wenn Java-Methoden in ihrem Rückgabetyp kovariant sind.Hier ist ein weiteres einfaches Beispiel:
Animal
KlasseDog
KlasseEs ist möglich, den Rückgabetyp der Methode von
Dog
'seekFood()
inDogFood
eine Unterklasse von zu ändernFood
, wie unten gezeigt:Das ist vollkommen gesetzlich zwingende, und der Rückgabetyp von
Dog
‚s -seekFood()
Methode ist bekannt als kovariante Rückgabetyp .quelle
Ab der Veröffentlichung von JDK 1.5 wurden kovariante Typen in Java eingeführt. und ich erkläre es Ihnen mit einem einfachen Fall: Wenn wir eine Funktion überschreiben, darf die Funktion ihr Verhalten ändern , das Sie in den meisten Büchern lesen können, aber was sie {Autoren} verpassen ist, dass wir auch den Rückgabetyp ändern können. Überprüfen Sie den folgenden Link, um zu verdeutlichen, dass wir den Rückgabetyp ändern können, solange er dem Rückgabetyp der Basisversion der Methode zugewiesen werden kann.
Diese Funktion zur Rückgabe abgeleiteter Typen heißt also COVARIANT ...
Können sich überschriebene Methoden im Rückgabetyp unterscheiden?
quelle
kovariante Rückgabetypen bedeuten einfach die Rückgabe einer eigenen Klassenreferenz oder ihrer untergeordneten Klassenreferenz.
quelle
Parent.foo()
ein nicht verwandter TypA
undChild.foo()
einB
abgeleiteter Typ zurückgegeben werdenA
.Um die obigen Antworten zu ergänzen, ist das Überschreiben zwischen Rückgabetypen mit zwei Varianten möglich, mit der Einschränkung, dass der Rückgabetyp der überschreibenden Methode (Unterklassenmethode) eine Unterklasse des Rückgabetyps der überschriebenen Methode (Oberklassenmethode) sein sollte. Dies gilt ab Java 5.
quelle
Der kovariante Rückgabetyp gibt an, dass der Rückgabetyp in derselben Richtung wie die Unterklasse variieren kann
Vor Java 5 war es nicht möglich, eine Methode durch Ändern des Rückgabetyps zu überschreiben. Aber jetzt, seit Java5,
Es ist möglich, die Methode durch Ändern des Rückgabetyps zu überschreiben, wenn die Unterklasse eine Methode überschreibt, deren Rückgabetyp nicht primitiv ist, deren Rückgabetyp jedoch in den Unterklassentyp geändert wird.
quelle
Wir haben die Freiheit, spezifischere Rückgabetypen zu haben, wenn
Methoden überschrieben werden.
Hilfe bei der Verhinderung von ClassCastExceptions zur Laufzeit bei Rückgaben
Referenz: www.geeksforgeeks.org
quelle
UnaryOperator.java
Function.java
quelle
Vor Java5 war es nicht möglich, eine Methode durch Ändern des Rückgabetyps zu überschreiben. Seit Java5 ist es jedoch möglich, die Methode durch Ändern des Rückgabetyps zu überschreiben, wenn die Unterklasse eine Methode überschreibt, deren Rückgabetyp nicht primitiv ist, deren Rückgabetyp jedoch in den Unterklassentyp geändert wird.
quelle