Скучное определение википедии:
"Ковариантностью называется сохранение иерархии наследования исходных типов в производных типах в том же порядке."
А на практике (в джаве) это значит, что:
1) при перегрузке методов можно менять возвращаемый тип на дочерний:
2) Творить всякие чудеса с массивами, так как они ковариантны:
А вот дженерики не ковариантны. Поэтому такой трюк с коллекциями не прокатит:
Более весело и подробно изложено тут с примерами для шарпа.
А на практике (в джаве) это значит, что:
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
Более весело и подробно изложено тут с примерами для шарпа.
Комментариев нет:
Отправить комментарий