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


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

7 84

7 ответов:

Covariant return, означает, что при переопределении метода тип возвращаемого значения переопределенного метода может быть подтипом типа возвращаемого значения переопределенного метода.

чтобы прояснить это на примере, общим случаем является 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() и что любой переопределенный метод может иметь ковариантный вернуться - я использовал его в качестве пример здесь, поскольку это стандартный метод, где это часто полезно.

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

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() метод известен как ковариантного возвращаемого типа.

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

таким образом, эта функция возврата производных типов называется КОВАРИАНТНОЙ...

могут ли переопределенные методы отличаться по типу возвращаемого значения?

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

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

}

Ковариантный тип возврата указывает, что тип возврата может изменяться в том же направлении, что и подкласс

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

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

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

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

  • помощь в предотвращении выполнения ClassCastExceptions при возврате

ссылка: www.geeksforgeeks.org

  • ковариантного возвращаемого типа в 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;
    }
}