Механизм приведения типов в Java (type casting) позволяет программисту явно или неявно преобразовывать значение одного типа в другой. Исторически эта особенность унаследована от C и C++, но в Java ограничена для повышения типобезопасности и предотвращения скрытых багов, связанных с переполнением или потерей данных.
Проблема заключается в возможности возникновения ClassCastException при приведении ссылочных типов, а также в потере точности при приведении примитивных типов, например, при переходе от double к int. Возможны логические ошибки при так называемом "downcasting" (приведении к типу-наследнику), если экземпляр не принадлежит этому классу.
Решение состоит в строгом разделении:
Пример кода для примитивов:
int i = 100; long l = i; // неявное приведение (int -> long) double d = l; // неявное (long -> double) int i2 = (int) d; // явное приведение (потеря дробной части)
Пример кода для ссылочных типов:
Object obj = "Hello"; // upcasting, неявно String s = (String) obj; // downcasting, явно
Ключевые особенности:
Может ли компилятор Java предотвратить любые ошибочные приведении типов?
Ответ: Нет, компилятор ловит только очевидные ошибки на стадии компиляции. Если приведение возможно в структуре типов (например, Object -> String), но в переменной реально лежит объект несовместимого типа, ошибка проявится только во время выполнения с ClassCastException.
Наследует ли Integer от Long, и можно ли написать Integer i = (Integer) someLong?
Ответ: Нет, Integer и Long — независимые классы-обёртки, между ними нельзя делать downcasting. Они оба наследуют Number, но не друг друга. Приведение вида (Integer) (Object) 1L; вызовет ClassCastException.
При явном приведении float к int происходит округление дробной части?
Ответ: Нет, происходит отбрасывание дробной части без округления:
float f = 3.99f; int i = (int) f; // i == 3, не 4
Разработчик получает на вход коллекцию Object, приводит каждый элемент к своему типу, но не проверяет instanceof. Проект стабильно падает с ClassCastException при некорректных данных.
Плюсы:
Минусы:
Все downcasting-операции производятся внутри if (obj instanceof TargetType) с явной обработкой ошибок. Для коллекций применяются дженерики.
Плюсы:
Минусы: