Главная » Java, Структуры данных и алгоритмы » Приведение типов в иерархии наследования

0

Переменные объектов (ссылочного типа) могут быть различных типов, но при объявлении переменных может быть указан только один тип (класс или интерфейс). Более того, объявленный тип переменной определяет, каким образом она используется и каким образом над ней выполняются определенные методы. Для предотвращения ошибок в Java используется технология строгого контроля типов, при которой переменная может быть только одного типа, а описание методов должно содержать тип переменных, необходимых для выполнения метода. Однако, несмотря на необходимость строгого соблюдения типа, иногда требуется проводить явное преобразование, или приведение типа переменной. В п. 1.3.3 уже рассматривалось приведение исходных типов переменных. В данном разделе рассмотрим преобразование типов переменных ссылочного типа.

В Java возможно преобразование типа Г объектной ссылки о в тип S при условии, что тип объекта, вызываемого переменной о, действительно S. В противном случае, если о относится к объекту Т, тип которого не S, попытка приведения дипа переменной о к типу S приведет к исключительной ситуации «ClassCastException». Данное правило наглядно демонстрируется в приведенном ниже фрагменте кода:

Number п; Integer i;

n = new lnteger(3);

i = (Integer) n; // правильно (допустимо) n = new Double(3.1415); i = (Integer) n; // неправильно (недопустимо)

Во избежание возникновения подобных проблем, а также излишнего использования блоков try-catch при каждой попытке приведения типов в Java встроен простой способ правильного выполнения приведения типов переменных. В частности, для этого используется оператор instanceof, с помощью которого можно проверить, относится ли переменная к объекту определенного класса (или реализует определенный интерфейс). Форма записи оператора следующая:

<object_reference> instanceof <referencejype>

где <object_reference> является выражением, к которому относится переменная, a <reference_type> — имя некоторого существующего класса или интерфейса. Если <object_reference> действительно является экземпляром <reference_type>, в этом случае записанное выше выражение верно и система выдает true, в противном случае она возвращает false. Таким образом, возможно предотвратить исключительную ситуацию «приведение типа в классе» в вышеприведенном фрагменте кода путем следующих изменений:

Number п; Integer i;

n new lnteger(3); if (n instanceof Integer)

i = (Integer) n; // верно n = new Double(3.1415); if (n instanceof Integer)

i = (Integer) n; // такая операция не будет выполняться!

Применение оператора instanceof гораздо проще и эффективнее блока try-catch.

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии