2015-07-03 1 views
3

В настоящее время я просматриваю исходный код java.util.ArrayList. Теперь найти функцию общественных недействительного ensureCapacity (INT minCapacity) отбрасывает массив объектов для общего массива, так же, как код ниже:Листинг массива объектов для общего массива

E[] newData = (E[]) new Object[Math.max(current * 2, minCapacity)]; 

Однако, когда я объявляю массив определенного типа, IDE покажет ошибка.

Object[] arr = new Object[10]; 
    int[] arr1 = (int[]) new Object[arr.length]; 

Любой может рассказать мне о различиях между ними? Большое спасибо.

ответ

3

Это потому, что E (в исходном коде ArrayList) обозначает некоторого эталонного типа, но не для какого-того примитивного типа.

И вот почему вы получаете ошибку времени компиляции при попытке передать массив экземпляров Object в массив примитивов.

Если вы делаете (например)

Object[] arr = new Object[10]; 
Integer[] arr1 = (Integer[]) new Object[arr.length]; 

пропадут ошибка.

3

Вы не можете бросить ссылочный тип (ничего, что простирается от Object) до примитивного типа (int, long, boolean, char и т.д.).

Вы также не можете отличить массив ссылочного типа, например Object[], к массиву примитивного типа, например int[].

И примитивы не могут стоять за общим параметром.

+0

Одно исключение: авто-бокс, например. бокс примитивного 'int' в объект Integer. Но вы правы в действиях массива: даже при автоматическом боксировании вы не можете использовать 'int []' в 'Integer []'. –

+0

@MattiasBeulens Но это не кастинг. Это просто обертывание значения –

+0

@VinceEmigh Технически правильно, но это похоже на литье, поэтому я подумал, что хотя бы упомянул об этом. –

2

int не Object, но это примитивно.

Используйте Integer, и он будет работать.

Object[] arr = new Object[10]; 
    Integer[] arr1 = (Integer[]) new Object[arr.length];