Я не могу понять, почему ArrayList<инт> — это нетразрешается, а ArrayList<интервал []> — это разрешается.
У меня сложилось впечатление, что примитивные типы данных не разрешены в коллекциях, так почему же это законно?
int[] — это ссылочный тип (т. е. вы можете присвоить int[] переменной Object).
Object o = new int[10];



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тип).
@AndyTurner System.out.println(args.getClass().getSuperclass()); выведет java.lang.Object. Итак, класс Sting[] — это java.lang.String, где в качестве суперкласса — java.lang.Object, что также делает его супертипом. Однако обратное неверно. Супертип может быть или не быть суперклассом.
Да, примитивные типы данных не разрешены в коллекциях.