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