Tipos de devolución covariantes en Java

A medida que el oído golpea los tímpanos «sobreescribiendo», rápidamente nos damos cuenta de que se puede hacer en virtud de diferentes tipos de datos o argumentos pasados ​​​​a una función, lo que un programador aprendió inicialmente mientras aprendía polimorfismo en Java .  Antes de JDK 5.0, no era posible anular un método cambiando el tipo de devolución. Cuando anulamos un método de la clase principal, el nombre, los tipos de argumentos y el tipo de retorno del método de anulación en la clase secundaria deben ser exactamente los mismos que los del método de la clase principal. Se dijo que el método de sobreescritura era invariable con respecto al tipo de retorno. 

Java versión 5.0 en adelante, es posible tener diferentes tipos de retorno para un método de anulación en la clase secundaria, pero el tipo de retorno del niño debe ser un subtipo del tipo de retorno del padre. El método de anulación se convierte en una variante con respecto al tipo de devolución.

El tipo de devolución covariante se basa en el principio de sustitución de Liskov .

Ahora, geeks, deben preguntarse por qué usar, para lo cual enumeraremos las ventajas de la siguiente manera:

  • Ayuda a evitar confundir las conversiones de tipos presentes en la jerarquía de clases y, por lo tanto, hace que el código sea legible, utilizable y mantenible.
  • Tenemos la libertad de tener tipos de devolución más específicos al anular métodos.
  • Ayuda para prevenir ClassCastExceptions en tiempo de ejecución en las devoluciones

Nota: Si intercambiamos los tipos de devolución de Base y Derivado, entonces el programa anterior no funcionará. Por favor vea este programa por ejemplo.

Ejemplo Dos clases utilizadas para tipos de devolución

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

Producción: 

Base fun()
Derived fun()

Este artículo es una contribución de Gaurav Miglani . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *