Pregunta

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

¿Fue útil?

Solución

retorno covariante, significa que cuando uno anula un método, el tipo de retorno del método predominante se le permite ser un subtipo de tipo de retorno del método reemplazado.

Para aclarar esto con un ejemplo, un caso común es Object.clone() - que se declara para devolver un tipo de Object. Se podría anular esta 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
   }
}

La ventaja aquí es que cualquier método que mantiene una referencia explícita a un objeto myFoo será capaz de invocar clone() y saber (sin casting) que el valor de retorno es una instancia de MyFoo. Sin tipos de retorno covariantes, el método reemplazado en myFoo tendría que ser declarado para volver Object - y así llamada codificada tendría que abatido de manera explícita el resultado de la llamada al método (incluso pensó dos lados "saben" que sólo puede ser nunca una instancia de myFoo).

Tenga en cuenta que no hay nada de especial en clone() y que cualquier método reemplazado puede tener un retorno covariantes -. Lo utilicé como ejemplo aquí ya que es un método estándar en el que esto es a menudo útil

Otros consejos

Este es un ejemplo más sencillo:

clase Animal

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

clase Dog

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

Es posible modificar el tipo de retorno de método Dog del seekFood() a DogFood - una subclase de Food, como se muestra a continuación:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

Eso es perfectamente legal un primordial, y el tipo de retorno del método de Dog seekFood() se conoce como covariante tipo de retorno .

A partir de la liberación de JDK 1.5, se introdujeron tipos covariantes en Java. y lo voy a explicar a usted con un simple caso,: Cuando anular una función se permite la función de realizar cambios en su comportamiento eso es lo que hay que leer en la mayoría de los libros, pero lo {} autores que se pierda es que podemos cambiar el tipo de retorno también. comprueban debajo de acoplamiento para la clarificación podemos cambiar el tipo de retorno, siempre que se puede asignar a devolver tipo de versión base del método.

Así que esta característica de volver tipos derivados se llama covariante ...

Puede anulado métodos difieren en tipo de retorno?

Los tipos de retorno covariantes significa simplemente regresar propia referencia de clase o su referencia de clase del niño.

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

}

covariante tipo de retorno especifica que el tipo de retorno 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 fue posible anulación de cualquier método cambiando el tipo de retorno. Pero ahora, ya Java5,

es posible reemplazar el método cambiando el tipo de retorno si subclase anula cualquier método cuyo tipo de retorno es no primitivos pero cambia el tipo que devuelve el tipo de subclase.

  • Ayuda a evitar el tipo de moldes de confuso presente en la jerarquía de clases y con lo que el código legible, usable y fácil de mantener.
  • conseguir una libertad de tener tipos de retorno más específicos cuando anulando
    métodos.

  • Ayuda en la prevención de ClassCastExceptions en tiempo de ejecución en los rendimientos

Referencia: www.geeksforgeeks.org

  
      
  • El tipo de retorno covariantes en Java que permite la reducción a tipo de retorno   del método reemplazado.
  •   
  • Esta característica le ayudará a evitar la colada abajo   en el lado del cliente. Permite al programador programa sin la necesidad   de comprobación de tipos y abatimiento.
  •   
  • El tipo de retorno covariantes siempre   sólo funciona para los tipos de retorno 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 el 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;
    }
}

Antes Java5, no fue posible reemplazar cualquier método cambiando el tipo de retorno. Pero ahora, ya Java5, es posible reemplazar el método cambiando el tipo de retorno, si subclase anula cualquier método cuyo retorno es de tipo no primitivo pero cambia el tipo que devuelve el tipo de subclase.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top