Ковариантный тип возвращаемого значения
В объектно-ориентированном программировании ковариантный тип возвращаемого значения метода — это тип, который можно заменить «более узким» (производным) типом, когда метод переопределяется в подклассе. Известным языком, в котором эта парадигма является довольно распространенной, является C++ .
C# поддерживает ковариацию возвращаемого типа начиная с версии 9.0. [1] Ковариантные типы возврата были (частично) разрешены в языке Java с момента выпуска JDK5.0. [2] поэтому следующий пример не будет компилироваться в предыдущей версии:
// Classes used as return types:
class A {
}
class B extends A {
}
// "Class B is narrower than class A"
// Classes demonstrating method overriding:
class C {
A getFoo() {
return new A();
}
}
class D extends C {
// Overriding getFoo() in parent class C
B getFoo() {
return new B();
}
}
Более конкретно, ковариантный (от широкого к более узкому) или контравариантный (от узкого к более широкому) тип возвращаемого значения относится к ситуации, когда тип возвращаемого значения переопределяющего метода изменяется на тип, связанный с типом возвращаемого значения исходного переопределенного метода (но отличающийся от него). . Отношения между двумя ковариантными типами возвращаемых значений обычно допускают замену одного типа другим в соответствии с принципом замены Лискова . Обычно это означает, что типы возвращаемых значений переопределяющих методов будут подтипами возвращаемого типа переопределенного метода. Приведенный выше пример конкретно иллюстрирует такой случай. Если замена не разрешена, тип возвращаемого значения является инвариантным и вызывает ошибку компиляции.
Другой пример ковариации с помощью встроенных классов Java Object и String:
class Parent {
public Object getFoo() {
return null;
}
}
class Child extends Parent {
// String is child of the greater Object class
public String getFoo() {
return "This is a string";
}
// Driver code
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.getFoo());
}
}
См. также
[ редактировать ]Внешние ссылки
[ редактировать ]Ссылки
[ редактировать ]- ^ «Ковариантный доход» . Документы Майкрософт . Проверено 8 сентября 2021 г.
- ^ Методы моста были введены для обхода проблем, возникающих из-за полиморфизма и нового стирания универсального типа.