Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Обобщенные типы данных.

Пупсик Ученик (97), на голосовании 1 год назад
Вопрос - Почему компилятор не дает ни добавить, ни изменить контейнер типа Consumer, передаваемый в параметрах метода? См. закомментированные строки.
При этом, такой же контейнер типа Consumer, созданный в теле этого метода изменять разрешает?

public static void main(String[] args) {
}

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 {}
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264147) 1 год назад
ну , стало быть на этапе компиляции тип списка еще не известен, поэтому используют методы которые работают с wildcard-списками типа get, addALL.
Вика Гуру (4065) 1 год назад
Проблема заключается в том, что вы используете ключевое слово "Consumer" как имя метода, но на самом деле это имя типа, объявленного в Java API для функциональных интерфейсов. Интерфейс Consumer<T> не предоставляет метода для добавления или изменения элементов в контейнере.
Тип параметра метода должен быть указан явно, а не использовать имя интерфейса Consumer. Кроме того, вы используете символ "?" в дженерике, что означает "неопределенный тип", который не может быть использован для добавления или изменения элементов в контейнере. Вместо этого вы можете использовать "super" для указания верхней границы типа, который может быть добавлен в контейнер.
ПупсикУченик (97) 1 год назад
  1. Consumer не является ключевым словом в Java, а название интерфейса вряд ли сбивает компилятор с мысли. Изменив Consumer на ConsumerV получим все то же самое. Мимо.
  2. "super" использовано, неужели не заметно? Как может вообще там быть знак вопроса без super или extends? Тоже мимо.
Похожие вопросы