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

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

5 голосов
/ 05 апреля 2019

Я не могу понять, почему ArrayList <<strong> int > не разрешен , а ArrayList <<strong> int [] > - 1010 * разрешено *.

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

Ответы [ 4 ]

6 голосов
/ 05 апреля 2019

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

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

int[] означает, что любой массив также является объектом.

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

5 голосов
/ 05 апреля 2019

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

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

Именно поэтому ArrayList<int> не разрешен, но ArrayList<int[]> разрешен.

2 голосов
/ 05 апреля 2019

int является примитивным.

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

ArrayList с ANY_OBJECT допустим.

ArrayList с ANY_PRIMITIVE недопустим.

и так как int [] является объектом, поэтому ArrayList возможен, но для примитива int ArrayList недействителен.

0 голосов
/ 05 апреля 2019

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

В Java есть класс для каждого типа массива, поэтому есть класс для int [] и аналогично для float, double и т. Д. Прямой суперкласс типа массива - Object. Каждый тип массива реализует интерфейсы Cloneable и 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); 
 } 
} 

Вывод: True Правда

Оператор diamond, используемый при инициализации 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;

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

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

...