Почему компилятор не дает ни добавить, ни изменить контейнер типа Consumer, передаваемый в параметрах метода?
Если передать пустой список, то проблемы нет, а если уже c экземплярами класса, то выдает ошибку на этапе компиляции.
При этом, такой же контейнер типа Consumer, созданный в теле этого метода изменять разрешает.
Наверное есть какой то принцип или правило, о котором я не знаю?
import java.util.ArrayList;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
Consumer(List.of(new Class3())); // вызывает ошибку;
//Consumer(new ArrayList<>()); // не вызывает ошибку;
}
private static void Consumer(List<? super Class3> listS1) {
listS1.add(new Class3());
listS1.add(new Class4());
listS1.add(new Class6());
listS1.set(0,new Class3());
List<? super Class3> listS2 = new ArrayList<>();
listS2.add(new Class3());
listS2.add(new Class4());
listS2.add(new Class6());
listS2.set(0,new Class3());
}
}
class Class1 {}
class Class2 extends Class1 {}
class Class3 extends Class2 {}
class Class4 extends Class3 {}
class Class5 extends Class4 {}
class Class6 extends Class5 {}