Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГТЭУ инфа экзамен.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
149.71 Кб
Скачать

1.4. Сужающие преобразования ссылок

Сужающие преобразования ссылок — это преобразования производных ссылочных типов в типы их потомков. Эти преобразования требуют проверки своей легитимности на этапе исполнения и могут генерировать исключение ClassCastException. Такими преобразованиями в Java являются:

  • преобразование любого класса в его потомка (в частности, преобразование типа Object в любой другой класс);

  • преобразование класса в интерфейс, когда класс не является финальным и не реализует данный интерфейс (в частности, преобразование типа Object в любой интерфейс);

  • преобразование типа Object в любой массив;

  • преобразование любого интерфейса в класс, который не является финальным;

  • преобразование любого интерфейса в класс, который является финальным и реализует данный интерфейс;

  • преобразование интерфейса J в интерфейс K, когда J не является потомком K, и не существует метода, декларированного и в J, и в K с одинаковой сигнатурой, но разными типами результата;

  • преобразование массива типа S[] в массив типа T[], если S и T — ссылочные типы, и преобразование S в T является сужающим.

1.5. Преобразования в строки

Любое выражение в Java, включая null, может быть преобразовано в тип String.

1.6. Недопустимые преобразования

Следующие преобразования типов в Java запрещены:

  • преобразование любого ссылочного типа в любой примитивный тип;

  • преобразование любого примитивного типа в любой ссылочной тип, кроме типа String;

  • преобразование нулевого типа в любой примитивный тип;

  • преобразования в нулевой тип или тип boolean;

  • преобразования типа boolean в любой другой тип, кроме типа String;

  • преобразование одного класса в другой, если ни один из них не является предком другого (кроме преобразования в тип String);

  • преобразование класса в интерфейс, если класс является финальным и не реализует данный интерфейс;

  • преобразование класса в массив, если класс отличен от Object;

  • преобразование интерфейс в класс, который является финальным и не реализует данный интерфейс (кроме преобразования в тип String);

  • преобразование интерфейса J в интерфейс K, если существует метод, декларированный и в J, и в K с одинаковой сигнатурой, но разными типами результата;

  • преобразование массива в класс, отличный от Object и String;

  • преобразование массива в интерфейс, отличный от Cloneable;

  • преобразование массива типа S[] в массив типа T[], если преобразование S в T является запрещенным

2. Контексты преобразований

2.1. Преобразование при присваивании

Преобразование при присваивании происходит, когда значение выражения присваивается переменной. При этом тип выражения преобразуется к типу переменной. При присваивании всегда возможны расширяющие преобразования типов (как числовых, так и ссылочных). Сужающее преобразование возможно только при соблюдении следующих условий:

  • переменная имеет тип byte, short или char;

  • значением выражения является константа типа int, которая попадает в диапазон возможных значений переменной.

Например, оператор byte x = 123; допустим, поскольку константа 123 (имеющая тип int) лежит в диапазоне допустимых значений типа byte.

Если тип выражения не может быть преобразован к типу переменной, то компилятор генерирует ошибку. В остальных случаях мы говорим, что тип выражения совместим по присваиванию с типом переменной. Так, следующий фрагмент

short s = 123;

char c = s; // генерирует ошибку компиляции

приведет к генерации ошибки, поскольку типы char и short несовместимы по присваиванию согласно данных выше определениям (первый реализован 16-битовыми словами без знака, а второй — со знаком).