Объяснение ковариантности, инвариантности и контравариантности простым английским языком?

Сегодня я прочитал несколько статей о ковариантности, контравариантности (и инвариантности) в Java. Я читал статьи в Википедии на английском и немецком языках, а также некоторые другие сообщения в блогах и статьи IBM.

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

Я ищу простое объяснение на простом английском языке, которое покажет новичку, что такое ковариация и контравариантность (и инвариантность). Плюс к простому примеру.

109
задан tzrm 9 June 2019 в 17:45
поделиться

1 ответ

Различие об отношениях между классами с различными параметрами дженериков. Их отношения являются причиной, почему мы можем бросить их.

Co и различие Мятежника являются довольно логическими вещами. Система типов языка вынуждает нас поддерживать реальную логику. Легко понять примером.

Ковариантность

, Например, Вы хотите купить цветок, и у Вас есть два цветочных магазина в Вашем городе: повысился магазин и гирляндный магазин.

, Если Вы спрашиваете кого-то, "где цветочный магазин?" и кто-то говорит Вам, где, повысился магазин, это будет хорошо? да, потому что повысился, цветок, если Вы хотите купить цветок, можно купить повышение. То же применяется, если кто-то ответил Вам с адресом гирляндного магазина. Это - пример [1 127] ковариантность : Вам разрешают бросить A<C> к A<B>, где C подкласс B, если A производит универсальные значения (возвраты в результате из функции). Ковариантность о производителях.

Типы:

class Flower {  }
class Rose extends Flower { }
class Daisy extends Flower { }

interface FlowerShop<T extends Flower> {
    T getFlower();
}

class RoseShop implements FlowerShop<Rose> {
    @Override
    public Rose getFlower() {
        return new Rose();
    }
}

class DaisyShop implements FlowerShop<Daisy> {
    @Override
    public Daisy getFlower() {
        return new Daisy();
    }
}

Вопрос, "где цветочный магазин?", ответ "повысился магазин там":

static FlowerShop<? extends Flower> tellMeShopAddress() {
    return new RoseShop();
}

Контравариантность

, Например, Вы хотите к цветку подарка Вашей девушке. Если Вы, подруга любит какой-либо цветок, можно рассмотреть ее как человека, который любит розы, или как человека, который любит гирлянды? да, потому что, если она любит какой-либо цветок, она любила бы и поднялась и гирлянда. Это - пример контравариантность : you’re позволил бросать A<B> к [1 110], где C подкласс [1 112], если A использует универсальное значение. Контравариантность о потребителях.

Типы:

interface PrettyGirl<TFavouriteFlower extends Flower> {
    void takeGift(TFavouriteFlower flower);
}

class AnyFlowerLover implements PrettyGirl<Flower> {
    @Override
    public void takeGift(Flower flower) {
        System.out.println("I like all flowers!");
    }

}

Вы рассматриваете свою девушку, которая любит любой цветок как кто-то, кто любит розы, и дайте ей, повысился:

PrettyGirl<? super Rose> girlfriend = new AnyFlowerLover();
girlfriend.takeGift(new Rose());

можно найти больше в Источник .

3
ответ дан 24 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: