logo

Tipi restituiti covarianti in Java

Non appena l'orecchio colpisce i timpani con la "prevalenza", capiamo subito che può essere fatto in virtù di diversi tipi di dati o argomenti passati a una funzione ciò che un programmatore ha imparato inizialmente mentre imparava polimorfismo in Java.  Prima di JDK 5.0 non era possibile farlo sovrascrivere un metodo modificando il tipo restituito. Quando sovrascriviamo un metodo della classe genitore, i tipi di argomento del nome e il tipo restituito del metodo di override nella classe figlia devono essere esattamente uguali a quelli del metodo della classe genitore. Si diceva che il metodo prevalente fosse invariante rispetto al tipo di reso. 

Dalla versione Java 5.0 in poi è possibile avere tipi restituiti diversi per un metodo di override nella classe figlia, ma il tipo restituito del figlio dovrebbe essere un sottotipo del tipo restituito del genitore. Il metodo prioritario diventa variante rispetto al tipo di reso.
Il tipo restituito co-variante è basato su Principio di sostituzione di Liskov .

Ora, geek, ti ​​starai chiedendo perché utilizzarlo e elencheremo i vantaggi come segue:



  • Aiuta a evitare di confondere i cast di tipi presenti nella gerarchia delle classi e quindi a rendere il codice leggibile, utilizzabile e manutenibile.
  • Abbiamo la libertà di avere tipi di restituzione più specifici durante l'override dei metodi.
  • Aiuta a prevenire ClassCastException in fase di esecuzione sui resi

Nota: Se scambiassimo i tipi di rendimento Base e Derivato, il programma precedente non funzionerebbe. Per favore vedi Questo programma per esempio.

Esempio Due classi utilizzate per i tipi restituiti

funzionamento interno di hashmap
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();  } } 

Produzione:  

Base fun() Derived fun()

Crea quiz