Der Mechanismus der kovarianten Rückgabewerte erlaubt es in Java, bei der Überschreibung einer Methode (Overriding) einen nicht genau gleichen Typ wie im Superklasse, sondern dessen Subtyp (kovarianter Typ) zurückzugeben.
Dies erhöht die Ausdruckskraft des Codes und erlaubt es, spezifischere Typen ohne explizite Typumwandlung zu erhalten.
Beispiel:
class Animal { } class Dog extends Animal { } class Parent { Animal getAnimal() { return new Animal(); } } class Child extends Parent { @Override Dog getAnimal() { return new Dog(); } // Kovarianter Rückgabewert }
Bedingungen für die Funktionsweise:
Ist es möglich, den Rückgabetyp einer überladenen Methode (Overloaded Method) im Unterklasse zu ändern, um ihn zu einem Subtyp des Basis-Typs zu machen? Wird dies als gültige Überladung betrachtet?
Antwort: Nein, für die Überladung (Overloading) ist nur die Signatur der Parameter wichtig, der Rückgabewert spielt keine Rolle. Nur den Rückgabetyp in der Überladung zu ändern ist nicht erlaubt — eine solche Methode würde mit der Signatur in Konflikt stehen.
Beispiel:
class Example { Animal make() { return new Animal(); } // Dog make() { return new Dog(); } // Compile error: Duplicate method! }
Kovarianz funktioniert nur für Overriding.
Geschichte
In einem Projekt machte der Programmierer einen Fehler und fügte eine überladene Methode mit demselben Namen und denselben Parametern, aber einem anderen Rückgabetyp hinzu, in der Erwartung, dass dies ein "kovarianter Rückgabewert" sei. Infolgedessen ließ sich das Projekt nicht kompilieren, und der Bug wurde erst bei CI entdeckt.
Geschichte
Bei der Verwendung von kovarianten Rückgabewerten in einer Klassenhierarchie wandte der Entwickler generische Typen (Generics) falsch an, indem er die Subtypen nicht korrekt implementierte, was zu einem ClassCastException während der Ausführung bei der Arbeit mit Sammlungen führte.
Geschichte
In der überschriebenen Methode wurde ein spezialisierterer Typ zurückgegeben, jedoch dokumentierte das Team diesen Vertrag nicht. Im Code, der durch den Basistyp arbeitete, traten Schwierigkeiten mit der Typumwandlung und unerwartetes Verhalten bei "Upcast"-Referenzen auf, was zu einer Reihe versteckter Fehler führte.