Я понимаю термины co-дисперсия и противоречие. Но есть одна маленькая вещь, которую я не могу понять. В курсе "Функциональное программирование в Scala" на coursera Мартин Ордерский упоминает, что:
Функции контравариантны в своих типах аргументов и ко-вариантах в их возвращаемые типы
Итак, например, в Java, пусть Dog
extends Animal
. И пусть функция будет:
void getSomething(Animal a){
и я вызываю вызов функции как
Dog d = new Dog();
getSomething(d)
Итак, в основном, что происходит, это Animal a = d
. И в соответствии с wiki ковариация - это "Преобразование шире к узкому". И выше мы переходим от собаки к животному. SO не является аргументом типа ковариантным, а не контравариантным?