
При использовании подстановочного знака (wildcard) "?" в качестве типа параметра при определении переменной или параметра метода, информация о типе объекта теряется, для компилятора он становится просто Object.
class MyClass { }
List<?> list = new ArrayList<MyClass>();
list.add(new MyClass()); // ошибка компиляции
Знак "?" подразумевает под собой абсолютно любой объект - String, Integer, MyClass и т. д. Но ArrayList<MyClass> содержит объекты только класса MyClass. Поскольку компилятор не может гарантировать того, что передаваемый объект будет являться экземпляром класса MyClass, он запрещает добавление элементов в список, использующий "?" в качестве типа параметра.