Почему я не могу добавить целое к этому типу списка, даже если Integer расширяет Number>Java общий подстановочные расширить
List<? extends Number> numList = new ArrayList<Integer>();
Integer f = 12;
numList.add(f);
Почему я не могу добавить целое к этому типу списка, даже если Integer расширяет Number>Java общий подстановочные расширить
List<? extends Number> numList = new ArrayList<Integer>();
Integer f = 12;
numList.add(f);
Вы должны использовать супер ключевое слово, если вы хотите, чтобы добавить элементы в список.
List<? super Integer> numList = new ArrayList<Integer>();
, а затем сделать
numList.add(10);
Это эквивалентно 'List
@JimGarrison Это упрощенный пример, поэтому варианты использования, где это может быть полезно, не очевидны из этого фрагмента кода. Намерение при использовании '? парадигма super Type 'заключается в том, что вы не извлекаете типизированные данные из списка. Чтобы процитировать сообщение, которое я связал: * «Если вы только вытаскиваете элементы из общей коллекции, это производитель, и вы должны использовать' extends', если вы только набиваете элементы, это потребитель, и вы должны использовать ' super'. Если вы делаете оба с одной и той же коллекцией, вы не должны использовать 'extends' или' super'. "* – nbrooks
Посмотрите this post по принципу ПЕСГ. Соответствующая цитата:
Вы хотите добавить вещи в коллекцию.
Тогда список является потребителем, поэтому вы должны использоватьCollection<? super Thing>
.
Короче говоря, вы хотите использовать super
, а не extends
:
List<? super Number> numList = new ArrayList<>();
Integer f = 12;
numList.add(f);
Это просто эквивалентно' List
@JimGarrison Нет, это по-прежнему безопасно. Он обеспечивает проверку типа компиляции, что все, добавляемое в список, является «Число». – nbrooks
Ссылка на это сообщение была очень полезна для меня, мой вопрос касался потребителя-производителя. –
Если вы хотите сохранить какие-либо числа, вы можете просто сделать следующее:
List<Number> numList = new ArrayList<Number>();
Этот список может быть определен как List, List и другой тип. В этом случае Compiler не позволяет вам хранить Integer в списке: это создаст проблему в свойствах безопасности типов.
, если вам нужно Вы можете использовать этот
List<Number> numList = new ArrayList<Number>();
Integer f = 100;
numList.add(f);
ли подстановочные знаки только для чтения и использования, но не для редактирования и добавления? –
Поскольку список может быть списком или списком , и вы не хотите, чтобы целое число сохранялось в списке : это разрушило бы тип безопасности дженериков. –
Как может быть список Double или BigDecimal, если я не могу добавить к нему? –