<?> то же самое, что <Object>

<?> то же самое, что <Object>

При использовании подстановочного знака (wildcard) "?" в качестве типа параметра при определении переменной или параметра метода, информация о типе объекта теряется, для компилятора он становится просто Object.


class MyClass { }


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