logo

Kovarianta returtyper i Java

När örat träffar trumhinnorna "överstyrande" får vi snabbt veta att det kan göras antingen på grund av olika datatyper eller argument som skickas till en funktion som en programmerare lärde sig från början när han lärde sig polymorfism i java.  Före JDK 5.0 var det inte möjligt att åsidosätta en metod genom att ändra returtyp. När vi åsidosätter en överordnad klassmetod måste namnargumenttyperna och returtypen för den åsidosättande metoden i den underordnade klassen vara exakt samma som för den överordnade klassmetoden. Den överordnade metoden sades vara invariant med avseende på returtyp. 

Java version 5.0 och framåt är det möjligt att ha olika returtyper för en överordnad metod i den underordnade klassen men barnets returtyp bör vara en undertyp av förälderns returtyp. Den överordnade metoden blir variant med avseende på returtyp.
Den samvarierande returtypen är baserad på Liskov substitution princip .

Nu måste du undra över varför du ska använda nördar som vi kommer att lista fördelarna för enligt följande:



  • Det hjälper till att undvika förvirrande typcasts som finns i klasshierarkin och därmed göra koden läsbar användbar och underhållbar.
  • Vi får friheten att ha mer specifika returtyper när vi åsidosätter metoder.
  • Hjälp till att förhindra körning av ClassCastExceptions vid returer

Notera: Om vi ​​byter returtyper av Base och Derived så skulle ovanstående program inte fungera. Vänligen se detta program till exempel.

Exempel Två klasser används för returtyper

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();  } } 

Produktion:  

Base fun() Derived fun()

Skapa frågesport