logo

Tipos de retorno covariantes em Java

À medida que o ouvido atinge os tímpanos, rapidamente ficamos sabendo que isso pode ser feito em virtude de diferentes tipos de dados ou de argumentos passados ​​para uma função, o que um programador aprendeu inicialmente enquanto aprendia polimorfismo em java.  Antes do JDK 5.0 não era possível substituir um método alterando o tipo de retorno. Quando substituímos um método da classe pai, o nome dos tipos de argumento e o tipo de retorno do método substituído na classe filha devem ser exatamente iguais aos do método da classe pai. Dizia-se que o método predominante era invariante em relação ao tipo de retorno. 

Java versão 5.0 em diante é possível ter diferentes tipos de retorno para um método de substituição na classe filho, mas o tipo de retorno do filho deve ser um subtipo do tipo de retorno do pai. O método de substituição torna-se variante em relação ao tipo de retorno.
O tipo de retorno covariante é baseado no Princípio de substituição de Liskov .

Agora, geeks, vocês devem estar se perguntando por que usar, para o qual listaremos as vantagens a seguir:



  • Isso ajuda a evitar conversões confusas de tipos presentes na hierarquia de classes e, assim, tornar o código legível, utilizável e sustentável.
  • Temos a liberdade de ter tipos de retorno mais específicos ao substituir métodos.
  • Ajuda na prevenção de ClassCastExceptions em tempo de execução em devoluções

Observação: Se trocarmos os tipos de retorno Base e Derivado, o programa acima não funcionaria. Por favor veja esse programa por exemplo.

Exemplo Duas classes usadas para tipos de retorno

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

Saída:  

Base fun() Derived fun()

Criar questionário