Jump to content

Ковариантный тип возвращаемого значения

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

См. также

[ редактировать ]
[ редактировать ]
  1. ^ «Ковариантный доход» . Документы Майкрософт . Проверено 8 сентября 2021 г.
  2. ^ Методы моста были введены для обхода проблем, возникающих из-за полиморфизма и нового стирания универсального типа.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: bf3874badcaab70e68b55e355a5422c6__1716206040
URL1:https://arc.ask3.ru/arc/aa/bf/c6/bf3874badcaab70e68b55e355a5422c6.html
Заголовок, (Title) документа по адресу, URL1:
Covariant return type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)