2013-04-27 1 views
1
Object arr = new int[]{1,2,3}; 
arr = (int[])arr; 

int someArr [] = (int[])arr; 

for(int i:arr) // compilation error 
    System.out.println(i); 

for(int i:someArr) //works fine 
    System.out.println(i); 

Почему литье во второй строке не преобразует arr в массив int? Я получаю ошибку компиляции в строке 4, в которой говорится: «Может только перебирать массив или экземпляр java.lang.Iterable». Во время отладки, в строке 2, моментальный снимок переменной показывает arr с индексированными значениями.Что не так с литой на второй строчке?

+0

Потому что 'arr' статически вводится как объект, и поэтому вы не можете изначально перебирать его. Используйте 'for (int i: someArr)'. –

+0

Нет прямого способа сделать это. Вы должны вручную вводить каждый элемент. – Lion

+4

Просто боковое примечание: лучше использовать стиль кодирования для записи 'int [] someArr'. В конце концов, это массив 'int', а не массив' someArr' –

ответ

5

Оператор arr = (int []) arr сначала пытается бросить значение, хранящееся в arr к int []. Затем, чтобы выполнить задание, он пытается отличить результат правой части от = от типа переменной в левой части. Так как тип переменной в левой части равен Object, то int [] отбрасывается до Object. Таким образом, arr остается Object.

Что мы узнаем из этого? Вы не можете изменить объявленный тип переменной. Никогда. В частности, вы не можете сделать это, присвоив ему что-то другое. Либо назначение работает, и назначенное значение передается объявленному типу переменной, или присваивание не выполняется. Тип переменной никогда не изменяется.

+0

приятный информация. благодаря – Nishant

0

Адрес: Object. Java не может магически cast вот так.

for(int i:someArr) // compile 
       System.out.println(i); 
0

Ваша отливка не изменит типа из arr. arr Тип по-прежнему Object, как вы заявили, и вы не можете перебирать Object.

1

Литье работает только в том порядке, в котором оно используется. В следующей строке компилятор забудет об этом и только увидит определение arr, которое по-прежнему Object. Если вы не хотите создавать новую переменную, вы можете добавить кастинг в те места, где вам нужно сообщить компилятору, что делать.

Object arr = new int[]{1,2,3}; 

for(int i : (int[])arr) // cast when using the object 
    System.out.println(i); 
1

Может только перебирать массив или экземпляр java.lang.Iterable.

Это относится к типу времени компиляции (то есть статическому), а не типу времени выполнения (то есть динамическому).

arr «s время компиляции является Object, что означает, что вы не можете перемещаться по ней, независимо от того, что его тип выполнения может быть.

1

Объявленный тип arr, являющийся Object, компилятор не уверен, что он относится к массиву и, следовательно, не знает, как его перебирать.

Почему приведение второй строки не преобразует arr в массив int?

Для ссылочных типов (например, Object) литье не преобразует, а просто проверяет, что эталонные точки указывают на объект данного типа. Если эта проверка завершится, вы можете использовать все возможности этого типа (если приведение не выполняется, генерируется исключение ClassCastException).

1

Потому что вы делаете вниз кастинг. В кастинге «Вниз» вам нужно выполнить Явное литье из объекта в Int. Вы делаете. Нравится

для (int i: someArr) // Это хорошо работает.

Таким образом, вы должны явно использовать этот arr для int.

В Up Casting вы не делаете Явное литье. По умолчанию используется Implicit Casting.

для (Object я = somearr)

Здесь, объект является супер класс из всех классов.

У вас есть моё мнение?

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