Я только что узнал в своем классе языков программирования, что «контравариантные типы аргументов на самом деле были бы безопасными, но они не были сочтены полезными и, следовательно, не поддерживаются в практических языках». Несмотря на то, что они не поддерживаются, я не понимаю, почему что-то вроде этого примера, который нам дали, теоретически было бы «безопасным»:
class Animal {
...
public bool compare(Panda) { ... }
}
class Panda extends Animal {
...
public bool compare(Animal) { ... }
}
Насколько я понимаю, проблемы с подтипами возникают, когда делается что-то, что может привести к потере специфичности. Так что, если я сделал это? :
Panda p = new Panda();
Animal a = new Animal
...
p.compare(a);
Когда я смотрю на это, мне кажется, что у панды могут быть (и, вероятно, есть) дополнительные поля, о которых обычное животное не знает. Таким образом, даже если все их элементы данных, относящиеся к животным, одинаковы, у панды могут быть другие вещи, которые отличаются. Как это позволит сравнивать его с обычным животным? Будет ли он просто рассматривать вещи, относящиеся только к животным, и игнорировать все остальное?