Теперь, когда массив введен как полноценный тип данных в Java. рассмотрим, какое влияние он окажет на преобразование типов.
Ранее подробно рассматривались переходы между примитивными и обычными (не являющимися массивами) ссылочными типами. Хотя массивы являются объектными типами, их также будет полезно разделить по базовому типу на две группы - основанные на примитивном или ссылочном типе.
Имейте в виду, что переходы между массивами и примитивными типами являются запрещенными. Преобразования между массивами и другими объектными типами возможны только для класса Object и интерфейсов Cloneable и Serializable., Массив всегда можно привести к этим W типам, обратный же переход является сужением и должен производиться явным образом по усмотрению разработчика. Таким образом, интерес представляют только переходы между разными типами массивов.
Известно, что массив, основанный на примитивном типе, принципиально следует преобразовать к типу массива, основанному на ссылочном типе, и наоборот.
Пока не будем останавливаться на этом подробно, однако заметим, д-Q преобразования между типами массивов, основанных на различных примитивных типах, невозможны ни при каких условиях.
:. Для ссылочных же типов такого строгого правила нет. Например, если создать экземпляр массива, основанного на типе Child, то ссылку на ngjo можно привести к типу массива, основанного на типе Parent.
Child с[] = new Child[3]; Parent p[] = с;
Вообще, существует универсальное правило: массив, основанный на лице А, можно привести к массиву, основанному на типе В, если сам тип А Приводится к типу В.
^•'' II если допустимо такое приведение: Bb = (B)newA();
// то допустимо и приведение массивов: Bb[]=(B[])newA[3];
Применяя это правило рекурсивно, можно преобразовывать многомерные массивы. Например, массив Child[][] можно привести к Parent[][], так как их базовые типы приводимы (Child[] кParent[]) также на Основе этого правила (поскольку базовые типы Child и Parent приводимы в силу правил наследования).
Как обычно, расширения можно проводить неявно (как в предыдущем примере), а сужения — только явным приведением.
^ Вернемся к массивам, основанным на примитивном типе. Невозможно их участия в преобразованиях типов связана, конечно, с различиями простыми и ссылочными типами данных. Поскольку элементами объектных массивов являются ссылки, они легко могут участвовать в причини. Напротив, элементы простых типов действительно хранят числовые булевские значения. Предположим, такое преобразование осуществимо:
// пример вызовет ошибку компиляции
byte Ь[]={1. 2,3};
intl[]=b;
в таком случае, элементы Ь[0] и i[0] хранили бы значения разных типов. Стало быть, преобразование потребовало бы копирования с одновременным преобразованием типа всех элементов исходного массива, в результате был бы создан новый массив, элементы которого равнялись бы по значению элементам исходного массива.
Но преобразование типа не может порождать новые объекты. Такие операции должны выполняться только явным образом с применением ключевого слова new. По этой причине преобразования типов массивов, основанных на примитивных типах, запрещены.
Если же копирование элементов действительно требуется, то нужно сначала создать новый массив, а затем воспользоваться стандартной функцией System.аггауСоруО, которая эффективно выполняет копирование элементов одного массива в другой.