Сегодня я прочитал несколько статей о ковариантности, контравариантности (и инвариантности) в Java. Я читал статьи в Википедии на английском и немецком языках, а также некоторые другие сообщения в блогах и статьи IBM.
Но я все еще немного не понимаю, о чем конкретно идет речь? Некоторые говорят, что это касается отношений между типами и подтипами, некоторые говорят, что это касается преобразования типов, а некоторые говорят, что это используется для определения того, переопределяется метод или перегружен.
Я ищу простое объяснение на простом английском языке, которое покажет новичку, что такое ковариация и контравариантность (и инвариантность). Плюс к простому примеру.
Различие об отношениях между классами с различными параметрами дженериков. Их отношения являются причиной, почему мы можем бросить их.
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());
можно найти больше в Источник .