Что мешает заполнять контейнер с обобщением, если его перекинуть в параметрах метода?

В Java, при работе с обобщениями (generics), контейнер с обобщением может быть заполнен только объектами, которые являются подтипами (или наследниками) указанного типа в момент создания контейнера. Если вы пытаетесь заполнить контейнер с обобщением другим типом данных, который не является подтипом указанного типа, компилятор выдаст ошибку.

Это ограничение называется "Принцип ограничения подстановки" (The Substitution Principle) и является частью системы типов Java. Оно гарантирует, что контейнер с обобщением будет содержать только объекты заданного типа (и его подтипы), предотвращая ошибки типизации во время выполнения программы.

Например, если у вас есть класс Container<T>, созданный с типом String, то только объекты типа String или его подтипы могут быть использованы при заполнении контейнера. Попытка добавить объект другого типа, например Integer, вызовет ошибку компиляции.

Пример:

Container<String> container = new Container<String>();
container.add("Привет"); // Допустимо, т.к. "Привет" является типом String
container.add(123); // Ошибка компиляции, т.к. 123 не является типом String

Однако, если вы хотите создать метод, который может принимать контейнер с обобщением и заполнять его элементы через параметры метода, это возможно. В этом случае, контейнер с обобщением должен быть передан в качестве аргумента метода, и его тип должен быть объявлен с помощью wildcard-символа (?) для обозначения неизвестного типа.

Пример:

public <T> void fillContainer(Container<? super T> container, T element) {
    container.add(element);
}

Container<Object> container = new Container<Object>();
fillContainer(container, "Привет"); // Допустимо, "Привет" теперь будет элементом контейнера

В приведенном примере метод fillContainer() принимает контейнер Container с неизвестным типом (обозначенным как ? super T) и добавляет в него элемент указанного типа T. Теперь контейнер будет иметь элемент, который был передан в качестве параметра метода.

Важно отметить, что при использовании wildcard-символа (?) для типа контейнера, мы ограничиваем возможности работы с элементами внутри контейнера. Мы можем только добавлять элементы в контейнер, но не получать доступ к ним или изменять их. Это связано с особенностями обработки типизации в Java и нужно быть осторожным при использовании wildcard-символа.