Приведение несовместимых типов

Хотя автоматическое преобразование типов удобно, оно не в состоянии удовлетворить все потребности. Например, что делать, если нужно присвоить значение типа int переменной типа byte? Это преобразование не будет выполняться автоматически, поскольку тип byte меньше типа int. Иногда этот вид преобразования называют преобразованием с сужением, поскольку значение явно сужается, чтобы оно могло уместиться в целевом типе.

Чтобы выполнить преобразование между двумя несовместимыми типами, необходимо использовать приведение типов. Приведение — это всего лишь явное преобразование типов. Общая форма преобразования имеет вид:

(целевой_тип) значение

Здесь целевой_тип определяет тип, к которому нужно преобразовать указанное значение. Например, следующий фрагмент кода приводит тип int к типу byte. Если значение целочисленного типа больше допустимого диапазона типа byte, оно будет уменьшено до результата деления по модулю (остатка от целочисленного деления) на диапазон типа byte.

int а; byte b; // ...
b = (byte) a;

При присваивании значения с плавающей точкой переменной целочисленного типа выполняется другой вид преобразования типа: усечение. Как вы знаете, целые числа не содержат дробной части. Таким образом, когда значение с плавающей точкой присваивается переменной целочисленного типа, дробная часть отбрасывается. Например, в случае присваивания значения 1,23 целочисленной переменной результирующим значением будет просто 1. Дробная часть — 0,23 — усекается. Конечно, если размер целочисленной части слишком велик, чтобы уместиться в целевом целочисленном типе, значение будет уменьшено до результата деления по модулю на диапазон целевого типа.

Следующая программа демонстрирует ряд преобразований типа, которые требуют приведения:

// Демонстрация приведения типов.
class Conversion { public static void main(String args[]) {
byte, b;
int i = 257;
double d = 323.142;
System.out.println("\nПреобразование int в byte.");
b = (byte) i;
System.out.println("i и b " + i + " " + b) ;
System.out.println("\nПреобразование double в int.");
i = (int) d;
System, out .println ("d и i " + d * " " + i) ;
System.out.println("\nПреобразование double в byte.");
b = (byte) d;
System.out.println ("d и b " + d + " " + b) ;
}
}

Эта программа генерирует следующий вывод:

Преобразование int в byte.
i и b 257 1 Преобразование double в int.
d и i 323.142 323 Преобразование double в byte.
d и b 323.142 67

Рассмотрим каждое из этих преобразований. Когда значение 257 приводится к типу byte, результатом будет остаток от деления 257 на 256 (диапазон допустимых значений типа byte), который в данном случае равен 1. Когда значение переменной d преобразуется в тип int, его дробная часть отбрасывается. Когда значение переменной d преобразуется в тип byte, его дробная часть отбрасывается, и значение уменьшается до результата деления по модулю на 256, который в данном случае равен 67.