
— А теперь небольшой урок от Диего. Кратко и по существу о преобразовании ссылочных типов.
— Начнем мы пока только с переменной типа Object. Этой переменной можно присвоить ссылку любого типа (расширение типа). Но чтобы выполнить обратное присваивание (сужение типа) приходится явно указывать операцию приведения:
Код | Описание |
---|---|
|
Типичное расширение ссылочного типа |
|
Типичное сужение ссылочного типа. |
|
Расширение типа. |
|
Ошибка во время исполнения! Невозможно привести ссылку на число к ссылке на строку. |
|
Ошибка во время исполнения! Невозможно привести ссылку на целое число к ссылке на дробное число. |
|
Приведение к своему типу. Операция сужения ссылочного типа. |
— При расширении или сужении ссылочных типов никакого изменения объекта не происходит. Сужающей (или расширяющей) является именно операция присваивания, при которой, либо выполняется «проверка соответствия типов переменной и ее нового значения» либо нет.
— Тот редкий пример, когда все ясно и понятно.
— Чтобы не было ошибок, как в примерах, есть способ узнать, какой именно тип сохранили в переменную типа Object:
int i = 5;
float f = 444.23f;
String s = "17";
Object o = f; //o хранит объект типа Float
if (o instanceof Integer)
{
Integer i2 = (Integer) o;
}
else if (o instanceof Float)
{
Float f2 = (Float) o; //отработает именно этот if
}
else if (o instanceof String)
{
String s2 = (String) o;
}
— Желательно выполнять такую проверку перед каждым сужением типа, если тип сохраненного объекта на 100% не известен.
— Понятно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ