@John_Honor

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

Почему компилятор не дает ни добавить, ни изменить контейнер типа 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 {}
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
List.of(...) создает неизменяемый (иммутабельный, unmodifiable) список.
В него нельзя ничего добавить, а вы в методе Consumer в первой же строке пытаетесь это сделать.

Если бы вы приложили в вопрос еще и сообщение об ошибке - это было бы очевидно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы