Terwijl het oor de trommelvliezen 'overheerst', komen we er snel achter dat dit kan worden gedaan dankzij verschillende datatypes of argumenten die worden doorgegeven aan een functie die een programmeur in eerste instantie heeft geleerd tijdens het leren polymorfisme in Java. Vóór JDK 5.0 was dit niet mogelijk overschrijven een methode door het retourtype te wijzigen. Wanneer we een bovenliggende klassemethode overschrijven, moeten de naamargumenttypen en het retourtype van de overschrijvende methode in de onderliggende klasse exact hetzelfde zijn als die van de bovenliggende klassemethode. Er werd gezegd dat de overheersende methode was invariant met betrekking tot het retourtype.
Vanaf Java versie 5.0 is het mogelijk om verschillende retourneringstypen te hebben voor een overschrijvende methode in de onderliggende klasse, maar het retourneringstype van het kind moet een subtype zijn van het retourneringstype van de ouder. De overheersende methode wordt variant met betrekking tot het retourtype.
Het co-variante retourtype is gebaseerd op de Liskov-substitutieprincipe .
Nu, nerds, moet je je afvragen waarom je het moet gebruiken, waarvoor we de voordelen als volgt zullen opsommen:
- Het helpt om verwarrende typecasts in de klassenhiërarchie te voorkomen en zo de code leesbaar, bruikbaar en onderhoudbaar te maken.
- We krijgen de vrijheid om specifiekere retourtypen te hebben bij het overschrijven van methoden.
- Hulp bij het voorkomen van runtime ClassCastExceptions bij retourzendingen
Opmerking: Als we de retourtypen Basis en Afgeleid omwisselen, zou het bovenstaande programma niet werken. Zie alstublieft dit programma bijvoorbeeld.
Voorbeeld Twee klassen gebruikt voor retourtypen
Java// Java Program to Demonstrate Different Return Types // if Return Type in Overridden method is Sub-type // Class 1 class A { } // Class 2 class B extends A { } // Class 3 // Helper class (Base class) class Base { // Method of this class of class1 return type A fun() { // Display message only System.out.println('Base fun()'); return new A(); } } // Class 4 // Helper class extending above class class Derived extends Base { // Method of this class of class1 return type B fun() { // Display message only System.out.println('Derived fun()'); return new B(); } } // Class 5 // Main class public class GFG { // Main driver method public static void main(String args[]) { // Creating object of class3 type Base base = new Base(); // Calling method fun() over this object // inside main() method base.fun(); // Creating object of class4 type Derived derived = new Derived(); // Again calling method fun() over this object // inside main() method derived.fun(); } }
Uitgang:
Base fun() Derived fun()
Quiz maken