От http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
Список является примером ограниченного шаблона. ? обозначает неизвестный тип, так же как и подстановочные знаки, которые мы видели ранее. Однако в этом случае мы знаем, что этот неизвестный тип на самом деле является подтипом Shape. (Примечание: это может быть сама форма или какой-то подкласс, она не должна буквально расширять форму.) Мы говорим, что Shape является верхней границей шаблона.
Существует, как обычно, цена за гибкость использования подстановочных знаков. Эта цена заключается в том, что теперь незаконно писать в фигуры в теле метода. Например, это не допускается:
public void addRectangle(List<? extends Shape> shapes) {
// Compile-time error!
shapes.add(0, new Rectangle());
}
Вы должны быть в состоянии понять, почему этот код запрещен. Тип второго параметра для shape.add() есть? extends Shape - неизвестный подтип Shape. Поскольку мы не знаем, что это такое, мы не знаем, является ли он супертипом Rectangle; это может быть или не быть таким супертипом, поэтому небезопасно пропускать Rectangle.
Конкретно говорить о своем решении, вы не можете вызвать реакцию с объектом Elem
типа, так как с типом Organic<? extends Elem>
вы можете законно назначить compound = new Organic<ElemSubClass>()
- и затем реагировать вызовет ошибку компиляции, поскольку вы не можете назвать его пропускание супер объекта класса.
Почему вы используете различные параметры для объявления переменной и объекта экземпляра? Чего вы пытаетесь достичь? – biziclop
Я не хочу ничего добиваться. Это просто упражнение из книги. –