List<? extends Animal> animalList=new List<Dog>();
List<? extends Animal> animalList=new List<Animal>();
Обе строки компилируются без ошибок.Любая функция, принимающая список в качестве параметра, понимает, что объекты в списке относятся к типу E или подтипу E.