2016-10-18 2 views
2

Почему я не могу добавить целое к этому типу списка, даже если Integer расширяет Number>Java общий подстановочные расширить

List<? extends Number> numList = new ArrayList<Integer>(); 
Integer f = 12; 
numList.add(f); 
+0

ли подстановочные знаки только для чтения и использования, но не для редактирования и добавления? –

+7

Поскольку список может быть списком или списком , и вы не хотите, чтобы целое число сохранялось в списке : это разрушило бы тип безопасности дженериков. –

+0

Как может быть список Double или BigDecimal, если я не могу добавить к нему? –

ответ

0

Вы должны использовать супер ключевое слово, если вы хотите, чтобы добавить элементы в список.

List<? super Integer> numList = new ArrayList<Integer>(); 

, а затем сделать

numList.add(10); 
+1

Это эквивалентно 'List ' и отбрасывает тип безопасности. При извлечении элементов из списка вы не сможете вызывать методы из 'Number' или' Integer' без явного приведения. –

+1

@JimGarrison Это упрощенный пример, поэтому варианты использования, где это может быть полезно, не очевидны из этого фрагмента кода. Намерение при использовании '? парадигма super Type 'заключается в том, что вы не извлекаете типизированные данные из списка. Чтобы процитировать сообщение, которое я связал: * «Если вы только вытаскиваете элементы из общей коллекции, это производитель, и вы должны использовать' extends', если вы только набиваете элементы, это потребитель, и вы должны использовать ' super'. Если вы делаете оба с одной и той же коллекцией, вы не должны использовать 'extends' или' super'. "* – nbrooks

2

Посмотрите this post по принципу ПЕСГ. Соответствующая цитата:

Вы хотите добавить вещи в коллекцию.
Тогда список является потребителем, поэтому вы должны использовать Collection<? super Thing>.

Короче говоря, вы хотите использовать super, а не extends:

List<? super Number> numList = new ArrayList<>(); 
Integer f = 12; 
numList.add(f); 
+0

Это просто эквивалентно' List ', что избавляет от безопасности типов. –

+0

@JimGarrison Нет, это по-прежнему безопасно. Он обеспечивает проверку типа компиляции, что все, добавляемое в список, является «Число». – nbrooks

+1

Ссылка на это сообщение была очень полезна для меня, мой вопрос касался потребителя-производителя. –

2

Если вы хотите сохранить какие-либо числа, вы можете просто сделать следующее:

List<Number> numList = new ArrayList<Number>(); 
0

Этот список может быть определен как List, List и другой тип. В этом случае Compiler не позволяет вам хранить Integer в списке: это создаст проблему в свойствах безопасности типов.

, если вам нужно Вы можете использовать этот

List<Number> numList = new ArrayList<Number>(); 
     Integer f = 100; 
     numList.add(f); 
Смежные вопросы