Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
// пример вызовет ошибку компиляции byte Ь[]={1, 2,3}; int i[]=b;
В таком случае, элементы Ь[0] и ¡[0] хранили бы значения разцц типов. Стало быть, преобразование потребовало бы копирования с одн0 временным преобразованием типа всех элементов исходного массива. ЎЎ результате был бы создан новый массив, элементы которого равнялись б( по значению элементам исходного массива.
Но преобразование типа не может порождать новые объекты. Такие операции должны выполняться только явным образом с применение^ ключевого слова new. По этой причине преобразования типов массивов основанных на примитивных типах, запрещены.
Если же копирование элементов действительно требуется, то нужно сначала создать новый массив, а затем воспользоваться стандартной функцией System.аггауСору(), которая эффективно выполняет копиро-вание элементов одного массива в другой.
Ошибка ArrayStoreException
Преобразование между типами массивов, основанных на ссылочных типах, может стать причиной одной довольно неочевидной ошибки. Рассмотрим пример:
Child с[] = new Child[5]; Parent р[]=с; p[0]=new Parent();
С точки зрения компилятора код совершенно корректен. Преобразование во второй строке допустимо. В третьей строке элементу массива типа Parent присваивается значение того же типа.
Однако при выполнении такой программы возникнет ошибка. Нельзя забывать, что преобразование не меняет объект, изменяется лишь способ доступа к нему. В свою очередь, объект всегда "помнит", от какого типа он был порожден. С учетом этих замечаний становится ясно, что в третьей строке делается попытка добавить в массив Child значение типа Parent, что некорректно.
Действительно, ведь переменная с продолжает ссылаться на этот массив, а значит, следующей строкой может быть такое обращение:
c[0].onlyChildMethod();
где метод onlyChildMethodO определен только в классе Child. Данное обращение совершенно корректно, а значит, недопустима ситуация, коь*1 элемент с[0] ссылается на объект, несовместимый с Child.
Таким образом, несмотря на отсутствие ошибок компиляции, вирту-наЯ машина при выполнении программы всегда осуществляет допол-\ггельную проверку перед присвоением значения элементу массива. Не-бхоДиМО Удостовериться, что реальный массив, существующий на мо-°ент