По причине , почему это не подходит, картинка вместо Enumerator
, List
. Оба используют дженерики - компилятор не обрабатывает ни один из них особым образом по отношению к дженерическим аргументам.
void doStuff() {
List<IParentThing> list = getList();
list.add(new ChildThing2());
}
List<IParentThing> getList() {
return new List<ChildThing1>(); //ERROR!
}
Этот первый метод хорош - список IParentThing
s должен быть в состоянии получить ChildThing2
. Но список ChildThing1
s не может обрабатывать ChildThing2
или любой другой реализатор IParentThing
, кроме ChildThing1
- другими словами, если List<ChildThing1>
было разрешено разыгрывать как List<IParent>
, он бы должен иметь возможность иметь дело со всеми подклассами IParentThing
, а не только IParentThing
и ChildThing1
.
Обратите внимание, что у дженериков Java есть способ сказать, что «я хочу список всего, что унаследовано от этого» в дополнение к «я хочу список всего, что унаследовано», что позволяет сделать более интересным (и, на мой взгляд, элегантно) решения некоторых проблем.