Pregunta ¿Qué es un tipo de retorno covariante?


¿Qué es un tipo de retorno covariante en Java? En la programación orientada a objetos en general?


80
2017-12-10 17:23


origen


Respuestas:


Retorno covariante, significa que cuando se anula un método, se permite que el tipo de devolución del método de anulación sea un subtipo del tipo de devolución del método anulado.

Para aclarar esto con un ejemplo, un caso común es Object.clone() - que se declara para devolver un tipo de Object. Puede anular esto en su propia clase de la siguiente manera:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

El beneficio aquí es que cualquier método que contenga una referencia explícita a un objeto MyFoo podrá invocar clone() y saber (sin emitir) que el valor de retorno es una instancia de MyFoo. Sin tipos de retorno covariantes, el método reemplazado en MyFoo tendría que declararse para devolver Object - y, por lo tanto, el código de llamada tendría que abatir explícitamente el resultado de la llamada al método (incluso si ambas partes "saben" que solo puede ser una instancia de MyFoo).

Tenga en cuenta que no hay nada especial sobre clone() y que cualquier método anulado puede tener un retorno covariante; lo usé como ejemplo aquí, ya que es un método estándar en el que a menudo es útil.


116
2017-12-10 17:24



Aquí hay otro ejemplo simple:

Animal clase

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog clase

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

Es posible modificar el tipo de devolución del DogEs seekFood() método para DogFood - una subclase de Food, Como se muestra abajo:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

Eso es perfectamente una anulación legal, y el tipo de devolución de DogEs seekFood() método es conocido como tipo de retorno covariante.


29
2017-09-14 19:36



Desde el lanzamiento de JDK 1.5, se introdujeron tipos covariantes en Java. y te lo explicaré con un caso simple, Cuando anulamos una función, la función puede realizar cambios en su comportamiento eso es lo que puedes leer en la mayoría de los libros, pero lo que ellos {autores} se pierden es que también podemos cambiar el tipo de devolución. verifique el enlace a continuación para obtener una aclaración. Podemos cambiar el tipo de devolución siempre y cuando se pueda asignar al tipo de devolución de la versión Base del método.

Entonces esta característica de devolver tipos derivados se llama COVARIANT ...

¿Pueden los métodos anulados diferir en el tipo de devolución?


6
2018-03-19 07:46



Los tipos de retorno covariantes simplemente significan devolver la propia referencia de clase o su referencia de clase secundaria.

class Parent {
 //it contain data member and data method
}

class Child extends Parent { 
//it contain data member and data method
 //covariant return
  public Parent methodName() {
     return new Parent();
          or 
     return Child();
  }

}

5
2017-09-18 13:49



  • El tipo de retorno covariante en java permite reducir el tipo de retorno   del método anulado
  • Esta característica ayudará a evitar el lanzamiento hacia abajo   en el lado del cliente. Permite al programador programar sin necesidad   de verificación de tipos y down casting.
  • El tipo de retorno covariante siempre   funciona solo para tipos de devolución no primitivos.
interface Interviewer {
    default Object submitInterviewStatus() {
        System.out.println("Interviewer:Accept");
        return "Interviewer:Accept";
    }
}
class Manager implements Interviewer {
    @Override
    public String submitInterviewStatus() {
        System.out.println("Manager:Accept");
        return "Manager:Accept";
    }
}
class Project {
    public static void main(String args[]) {
        Interviewer interviewer = new Manager();
        interviewer.submitInterviewStatus();
        Manager mgr = new Manager();
        mgr.submitInterviewStatus();
    }
}

Otro ejemplo es de Java,

UnaryOperator.java

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {

    /**
     * Returns a unary operator that always returns its input argument.
     *
     * @param <T> the type of the input and output of the operator
     * @return a unary operator that always returns its input argument
     */
    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}

Function.java

@FunctionalInterface
public interface Function<T, R> {

    ........
    ........
    ........
    ........

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

0
2018-06-10 08:05



El tipo de devolución covariante especifica que el tipo de devolución puede variar en la misma dirección que la subclase

class One{  
    One get(){return this;}  
}  

class Two extends One{  
  Two get(){return this;}  

void message(){
  System.out.println("After Java5 welcome to covariant return type");
}  

public static void main(String args[]){  
    new Two().get().message();  
}  
}

Antes de Java 5, no era posible anular ningún método cambiando el tipo de devolución. Pero ahora, desde Java5,

es posible anular el método cambiando el tipo de devolución si la subclase anula cualquier método cuyo tipo de devolución es no primitivo pero cambia su tipo de devolución a tipo de subclase.


0
2018-06-12 11:23



  • Ayuda a evitar confusiones de tipos presentes en la jerarquía de clases y, por lo tanto, hace que el código sea legible, utilizable y mantenible.
  • Obtenemos la libertad de tener tipos de devolución más específicos al anular
    métodos.

  • Ayuda para evitar ClassCastExceptions en tiempo de ejecución en devoluciones

referencia: www.geeksforgeeks.org


0
2018-04-18 22:29