Вопрос

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

Это было полезно?

Решение

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

Чтобы пояснить это на примере, типичным случаем является 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х seekFood() метод DogFood - подкласс Food, как показано ниже:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

Это совершенно законное переопределение, и тип возвращаемого значения Dogх 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;
    }
}

Function.java

@FunctionalInterface
public interface Function<T, R> {

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top