Реальный пример где без этого не обойтись?
Нажмите, чтобы раскрыть...
да на вики вон сразу же примеры есть, новые выдумать могу конечно, но проще скопипастить. Для практики я бы просто закодил класс мебель и класс стулья и пробовал бы играться с этим, до полного осознания, но ща мне влом хы
В контейнерах, допускающих запись объектов, ковариантность считается нежелательной, поскольку она позволяет обходить контроль типов. В самом деле, рассмотрим ковариантные массивы. Пусть классы Cat и Dog наследуют от класса Animal (в частности, переменной типа Animal можно присвоить переменную типа Cat или Dog). Создадим массив Cat[]. Благодаря контролю типов в этот массив можно записывать лишь объекты типа Cat и его потомков. Затем присвоим ссылку на этот массив переменной типа Animal[] (ковариантность массивов это позволяет). Теперь в этот массив, известный уже как Animal[], запишем переменную типа Dog. Таким образом, в массив Cat[] мы записали Dog, обойдя контроль типов. Поэтому контейнеры, разрешающие запись, желательно делать инвариантными. Также, контейнеры, разрешающие запись, могут реализовывать два независимых интерфейса, ковариантный Producer и контравариантный Consumer, в этом случае вышеописанный обход контроля типов сделать не удастся.