2016-10-21 6 views
1

Java не поддерживает создание коллекции из примитивов, поэтому следующая конструкция дает ошибку компиляции («Аргумент не может быть примитивного типа):Почему возможно создать коллекцию массива примитивов, но не сбор примитивов

List<int> ints = new ArrayList<int>(); 

с другой стороны, создавая коллекцию массивов или примитивов допускается, поэтому следующая конструкция нормально:

List<int[]> ints = new ArrayList<int[]>(); 

Что такое логика этого


Редактировать: вопрос действительно о массиве примитивов, а не о примитивах, поэтому, пожалуйста, не объясняйте мне, почему я не могу хранить примитивы в коллекции, но почему я могу создать массив массивов примитивов внутри коллекции?

+1

Потому что массив - это объект, а не примитив. – Axel

+0

@Axel: Где сказано, что массив примитивов является объектом? – walkeros

+0

@BackSlash: На самом деле это не ответ, он не говорит, что массив примитивов является объектом или нет. – walkeros

ответ

5

Коллекции являются общими: Collection<T>. T должен быть ссылочным. Примитивы не являются ссылочными типами. С другой стороны, массив примитивов является ссылочным типом, поэтому вы можете поместить его в Collection. Помните, что каждый примитив имеет класс оболочки, который может быть передан как тип в общий тип.

Согласно specification:

Type: 
    PrimitiveType 
    ReferenceType 

Класс является общим, если он объявляет одну или несколько переменных типа (§4.4).

#

4.3.1. Объекты Объект - это экземпляр класса или массив.

#

4,4. Переменные типа Тип переменной - это неквалифицированный идентификатор, используемый как тип в классе, интерфейсе, методе и конструкторах.

+0

Это правда, однако это не полный ответ, я думаю, поскольку дженерики живут только до времени компиляции. На самом деле, если вы используете dony generic type, вы можете написать что-то вроде: «List a = new ArrayList(); a.add (новый int [0]); a.add (0); '. Первый будет сохранен как массив, а второй будет автобоксирован и НЕ хранится как примитив. – walkeros

Смежные вопросы