Используя super, вы определяете нижнюю границу вашего параметра типа. Вы говорите, что фактический тип вашего органического объекта имеет тип Elem2 или один из его супертипов. Таким образом, компилятор заменяет сигнатуру вашего метода реагирования для Elem2, например
void react(Elem2 value) {}
Таким образом, вы не можете передать новый Elem () вашему объекту, потому что это потребует снижения рейтинга.
То есть вы не можете сделать это по той же причине, по которой вы не можете передать число в метод, требующий целое число. Если вы применяете downcasting, проблема решена.
public static void main(String[] args) {
Organic<Object> all = new Organic<Object>();
Organic<? super Elem2> other = all;
Elem a = new Elem2();
other.react((Elem2)a);
}
Кроме того, вы можете delcare как
Organic<? super Elem> other = ...;
Что должно сработать.