Ваше понимание co-variant
верно, а использование - нет. List<SubChild>
не совпадает с List<SuperChild>
Учтите, что List<Animals>
- это не то же самое, что List<Dogs>
, и все может пойти ужасно неправильно, если это будет разрешено. Dog
- это Animal
, но если ему было разрешено присваивать, как показано ниже:
List<Dogs> dogs = new ArrayList<Dogs>();
List<Animals> animals = dogs; //not allowed.
что происходит, когда вы добавляете в нее кошку?
animals.add(new Cat());
и
Dog dog = dogs.get(0); //fail
Так что это не разрешено.
Как и многие другие, используйте List<? extends SuperChild>
в качестве типа возврата, чтобы решить вашу проблему.
EDIT
На ваш комментарий выше, если у вас нет контроля над суперклассом, боюсь, вы ничего не сможете сделать.