Что такое ковариантный тип возвращаемого значения в Java? В объектно-ориентированном программировании вообще?
java
oop
covariance
Попс
источник
источник
Ответы:
Ковариантный возврат означает, что при переопределении метода возвращаемый тип переопределяющего метода может быть подтипом типа возвращаемого значения переопределенного метода.
Чтобы прояснить это на примере, распространенным случаем является
Object.clone()
- который объявлен как возвращающий типObject
. Вы можете переопределить это в своем собственном классе следующим образом:Преимущество здесь заключается в том, что любой метод, который содержит явную ссылку на объект MyFoo, сможет вызывать
clone()
и знать (без приведения), что возвращаемое значение является экземпляромMyFoo
. Без ковариантных типов возврата необходимо было бы объявить переопределенный метод в MyFoo для возвратаObject
- и поэтому вызывающий код должен был бы явно понижать результат вызова метода (даже если бы обе стороны «знали», что это может быть только экземпляр MyFoo ).Обратите внимание, что в этом нет ничего особенного
clone()
и что любой переопределенный метод может иметь ковариантный возврат - я использовал его в качестве примера здесь, поскольку это стандартный метод, где это часто бывает полезно.источник
List<Foo>
иList<FooBar>
?clone()
как об aMethod<Void, Object>
и спрашивать, можно лиMethod<Void, MyFoo>
присвоить более конкретное определение этому родительскому типу. Так оно и есть, если и только если методы Java ковариантны по типу возвращаемого значения.Вот еще один простой пример:
Animal
классDog
классМожно изменить тип возвращаемого значения
Dog
«sseekFood()
метода кDogFood
- подклассFood
, как показано ниже:Это совершенно законная наиважнейшее, и возвращаемый тип
Dog
«SseekFood()
метод известен как ковариантном типа возвращаемого .источник
Начиная с выпуска JDK 1.5, ковариантные типы были введены в Java. и я объясню вам это на простом примере: когда мы переопределяем функцию, функции разрешается вносить изменения в ее поведение , это то, что вы читаете в большинстве книг, но то, что они {авторы} упускают в том, что мы можем изменить и возвращаемый тип. проверьте ссылку ниже для пояснения, мы можем изменить тип возвращаемого значения, если он может быть назначен типу возврата базовой версии метода.
Итак, эта функция возврата производных типов называется КОВАРИАНТНОЙ ...
Могут ли переопределенные методы отличаться по типу возвращаемого значения?
источник
Ковариантные возвращаемые типы просто означают возвращение собственной ссылки на класс или ссылки на его дочерний класс.
источник
Parent.foo()
возвращает несвязанный типA
иChild.foo()
возвращает тип,B
производный отA
.Чтобы добавить к приведенным выше ответам, переопределение возможно среди ковариантных возвращаемых типов с ограничением, что возвращаемый тип метода переопределения (метод подкласса) должен быть подклассом типа возвращаемого значения переопределенного метода (метод суперкласса). Это действительно начиная с Java 5.
источник
Ковариантный тип возвращаемого значения указывает, что тип возвращаемого значения может изменяться в том же направлении, что и подкласс
До Java 5 было невозможно переопределить какой-либо метод путем изменения типа возвращаемого значения. Но теперь, начиная с Java5,
можно переопределить метод, изменив тип возвращаемого значения, если подкласс переопределяет любой метод, тип возвращаемого значения которого не является примитивным, но он меняет свой тип возвращаемого значения на тип подкласса.
источник
Мы можем иметь более конкретные возвращаемые типы при переопределении
методов.
Помощь в предотвращении исключений ClassCastExceptions во время выполнения при возврате
ссылка: www.geeksforgeeks.org
источник
UnaryOperator.java
Function.java
источник
До Java5 было невозможно переопределить какой-либо метод, изменив тип возвращаемого значения. Но теперь, начиная с Java5, можно переопределить метод, изменив тип возвращаемого значения, если подкласс переопределяет любой метод, тип возвращаемого значения которого не является примитивным, но он меняет свой тип возвращаемого значения на тип подкласса.
источник