Вопрос о ковариации и контравариантности - PullRequest
0 голосов
/ 23 сентября 2019

Я читал во многих блогах, что входные данные метода являются контравариантными, а тип возвращаемых значений - ковариантными.Насколько я понимаю, оба являются ковариантными (где вместо фактического типа можно указать его подтип).Это можно продемонстрировать с помощью приведенного ниже примера.

class SuperClass{}
class SubClass extends SuperClass{}
class SubClass1 extends SubClass{}

public class VarianceExample {

    public SubClass method(SuperClass ip) {
        return new SubClass();
    }

    public static void main(String[] args) {        
        new VarianceExample().method(new SubClass());
    }
}

В приведенном выше фрагменте кода при вызове метода () его входные данные могут быть экземплярами: SuperClass, SubClass, SubClass1.Аналогичным образом, если мы изменим тип возвращаемого значения (с нового SubClass ()) на новый SubClass1 (), это будет работать хорошо.В обоих сценариях ясно, что они являются только ковариантными.

Но если мы изменим инструкцию return на 'new SuperClass ()', компилятор выдаст синтаксическую ошибку.И точно так же, если мы передадим что-нибудь, что является суперклассом SuperClass (допустим, что он есть; но не во фрагменте кода выше), компилятор выдаст ошибку.

Тогда как мы можем сказать, что я/ p являются контрвариантными, а выходные данные ковариантными?Оба ковариантны, не так ли?

Не могли бы вы помочь.Спасибо!

...