ArrayList<int> против ArrayList<int[]>?

Я не могу понять, почему ArrayList<инт> — это нетразрешается, а ArrayList<интервал []> — это разрешается.

У меня сложилось впечатление, что примитивные типы данных не разрешены в коллекциях, так почему же это законно?

Да, примитивные типы данных не разрешены в коллекциях.

Emre Acar 05.04.2019 08:14
int[] — это ссылочный тип (т. е. вы можете присвоить int[] переменной Object).
Andy Turner 05.04.2019 08:16
Object o = new int[10];
user85421 05.04.2019 08:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
3
939
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

array в Java — это объект. В Java мы можем создавать массивы с помощью оператора new, и мы знаем, что каждый объект создается с помощью оператора new. Следовательно, мы можем сказать, что array также является объектом.

Коллекция работает только со всем, что есть Object. int — примитивный тип данных, а int[] — объект.

Вот почему ArrayList<int> нельзя, а ArrayList<int[]> разрешено.

Обобщения работают только для ссылочного типа (все, что является Объект).

Примитивный int не является ссылочным типом.

int[] есть, так как массив Любые тоже является Объектом.

Правильный способ работы с несколькими значениями int — либо использовать только чтоint[] (не помещая их в списки), либо использовать List<Integer>. Какой из них выбрать, действительно зависит от вашего конкретного варианта использования.

int примитивен.

int[] является объектом.

ArrayList с ANY_OBJECT действителен.

ArrayList с ANY_PRIMITIVE недействителен.

а так как int[] является объектом, то ArrayList возможен, но для примитива int ArrayList НЕДЕЙСТВИТЕЛЬНО.

Массив в Java — это объект. В Java мы можем создавать массивы с помощью оператора new, и мы знаем, что каждый объект создается с помощью оператора новый.

В Java есть класс для каждого типа массива, поэтому есть класс для int[] и аналогично для float, double и т.д. Непосредственным суперклассом типа массива является Object. Каждый тип массива реализует интерфейсы Клонируемый и java.io.Serializable. Все методы класса Object могут быть вызваны для массива. Это можно проверить из приведенного ниже кода:

public class Test { 
public static void main(String[] args) 
{  
    System.out.println(args instanceof Object); 
    int[] arr = new int[2]; 
    System.out.println(arr instanceof Object); 
 } 
} 

Выход: правда Истинный

Алмазный оператор, используемый при инициализации ArrayList, задает универсальный тип. Универсальный тип — это универсальный класс или интерфейс, параметризованный над типами.

Вы можете просмотреть исходный код ArrayList здесь: http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/java/util/ArrayList.java

Вы можете видеть, что типом elementData в параметризованном конструкторе является Object. Примитив — это тип данных, который не является объектом:

private transient Object[] elementData;

Так как инт является примитивным типом данных в java, его нельзя использовать в качестве универсального типа, в то время как интервал [] , который имеет прямой объект суперкласса, может быть.

Подробнее об этом можно прочитать здесь: https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html

«Это можно проверить из приведенного ниже кода:», но System.out.println(args instanceof Object[]); также будет верным, хотя Object[] не является суперклассом String[]. (Однако это superтип).

Andy Turner 05.04.2019 08:52

@AndyTurner System.out.println(args.getClass().getSuperclass()); выведет java.lang.Object. Итак, класс Sting[] — это java.lang.String, где в качестве суперкласса — java.lang.Object, что также делает его супертипом. Однако обратное неверно. Супертип может быть или не быть суперклассом.

Carrot 05.04.2019 11:03

Другие вопросы по теме