четверг, 22 мая 2014 г.

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

Скучное определение википедии:

"Ковариантностью называется сохранение иерархии наследования исходных типов в производных типах в том же порядке."

А на практике (в джаве) это значит, что: 

 1) при перегрузке методов можно менять возвращаемый тип на дочерний:

class Animal {
    public Animal createBaby(){
        return new Animal();
    }
}
 
class Cat extends Animal {
    @Override
    public Cat createBaby() {
        return new Cat();
    }
}


2) Творить всякие чудеса с массивами, так как они ковариантны:

Animal[] animals = new Animal[3];
animals = new Cat[4];

А вот дженерики не ковариантны. Поэтому такой трюк с коллекциями не прокатит:

List<Animal> animalList = new ArrayList<>();
List<Cat> catList = new ArrayList<>();
animalList = catList;  //compilation error

Более весело и подробно изложено тут с примерами для шарпа.

Комментариев нет:

Отправить комментарий