logo

Kovariante returtyper i Java

Ettersom øret treffer trommehinnene 'overstyrer', får vi raskt vite at det kan gjøres enten i kraft av forskjellige datatyper eller argumenter som overføres til en funksjon som en programmerer lærte i utgangspunktet mens han lærte polymorfisme i java.  Før JDK 5.0 var det ikke mulig å overstyre en metode ved å endre returtype. Når vi overstyrer en overordnet klassemetode, må navneargumenttypene og returtypen for den overordnede metoden i barneklassen være nøyaktig de samme som for den overordnede klassemetoden. Den overordnede metoden ble sagt å være invariant med hensyn til returtype. 

Java versjon 5.0 og utover er det mulig å ha forskjellige returtyper for en overordnet metode i barneklassen, men barnets returtype bør være en undertype av overordnets returtype. Den overordnede metoden blir variant med hensyn til returtype.
Kovariant returtype er basert på Liskov substitusjonsprinsipp .

Nå lurer du kanskje på hvorfor du skal bruke det, og vi vil liste opp fordelene som følger:



  • Det hjelper å unngå forvirrende type casts som finnes i klassehierarkiet og dermed gjøre koden lesbar brukbar og vedlikeholdbar.
  • Vi får frihet til å ha mer spesifikke returtyper ved overstyring av metoder.
  • Hjelp til å forhindre kjøring av ClassCastExceptions på returer

Note: Hvis vi bytter returtyper av Base og Derived, vil programmet ovenfor ikke fungere. Vennligst se dette program for eksempel.

typescript datotype

Eksempel To klasser brukt for 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();  } } 

Produksjon:  

Base fun() Derived fun()

Lag quiz