Что такое ковариантный тип возврата?

Что такое ковариантный тип возврата в Java? В объектно-ориентированном программировании вообще?

Ответ 1

Возврат коварианта означает, что при переопределении метода возвращаемый тип переопределяющего метода разрешен как подтип возвращаемого типа переопределенного метода.

Чтобы прояснить это с помощью примера, общий случай Object.clone() - который объявляется как возвращающий тип Object. Вы можете переопределить это в своем классе следующим образом:

public class MyFoo
{

   ...

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

Преимущество в том, что любой метод, который содержит явную ссылку на объект MyFoo, сможет вызывать clone() и знать (без кастования), что возвращаемое значение является экземпляром MyFoo. Без ковариантных типов возврата переопределенный метод в MyFoo должен быть объявлен для возврата Object - и поэтому вызывающий код должен явно опускать результат вызова метода (даже если обе стороны "знают", что это может быть только когда-либо экземпляр MyFoo).

Обратите внимание, что нет ничего особенного в clone() и что любой переопределенный метод может иметь ковариантный возврат - я использовал его в качестве примера здесь, как стандартный метод, где это часто полезно.

Ответ 2

Вот еще один простой пример:

Animal класс

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog класс

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

Его можно изменить возвращаемый тип метода Dog s seekFood() на DogFood - подкласс Food, как показано ниже:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

Совершенно законно переопределяется, а тип возврата метода Dog s seekFood() известен как ковариантный тип возврата.

Ответ 3

Из выпуска JDK 1.5 в Java были введены ковариантные типы. и я объясню это вам простым случаем: Когда мы переопределяем функцию, функция позволяет вносить в нее изменения, которые вы читаете в большинстве книг, но то, что они (авторы) пропускают что мы можем изменить тип возврата тоже. проверьте ниже ссылку для уточнения, мы можем изменить тип возврата, если он может быть назначен для возврата типа базовой версии метода.

Итак, эта функция возвращаемых производных типов называется COVARIANT...

Можно ли переопределить методы в обратном типе?

Ответ 4

covariant Возвращаемые типы просто означают возврат собственной ссылки на класс или ее ссылку на дочерний класс.   класс Родитель   {    // он содержит элемент данных и метод данных   }

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

}

Ответ 5

  • Ковариантный тип возврата в java, позволяет сузить возвращаемый тип переопределенного метода.
  • Эта функция поможет избежать пуска на стороне клиента. Это позволяет программисту программировать без необходимости проверки типов и пускового литья.
  • Ковариантный тип возврата всегда работает только для не примитивных типов возврата.
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();
    }
}

Другой пример - из 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;
    }
}

Ответ 6

Covariant return type specifies that the return type may vary in the same direction as the subclas

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

Before Java5, 

было невозможно переопределить какой-либо метод путем изменения типа возврата. Но теперь, поскольку Java5,

можно переопределить метод, изменив тип возврата если подкласс отменяет любой метод чей тип возврата является непримитивным но он изменяет тип возвращаемого значения на тип подкласса.