Читать «Java: руководство для начинающих» онлайн - страница 46

Герберт Шилдт

В то же время тип double не может быть автоматически преобразован в тип long, поскольку такое преобразование уже не является расширяющим. Следовательно, приведенный ниже вариант той же самом программы оказывается некорректным. // *** Эта программа не подлежит компиляции. *** class LtoD { public static void main(String args[]) { long L; double D; D = 100123285.0; // Тип double не преобразуется автоматически в тип long. L = D; // Ошибка!!! System.out.println("L and D: " + L + " " + D) ; } }

Автоматическое преобразование числовых типов в тип char или boolean не производится. Кроме того, типы char и boolean несовместимы друг с другом. Тем не менее переменной char может быть присвоено значение, представленное целочисленным литералом. Приведение несовместимых типов

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

где целевой_тип обозначает тот тип, в который желательно преобразовать указанное выражение. Так, если требуется привести значение, возвращаемое выражением х / у, к типу int, это можно сделать следующим образом: double х, у; // ... (int) (х / у)

В данном случае приведение типов обеспечит преобразование результатов выполнения выражения в тип int, несмотря на то, что переменные х и у принадлежат к типу double. Выражение х / у следует непременно заключить в круглые скобки, иначе будет преобразован не результат деления, а только значение переменной х. Приведение типов в данном случае требуется потому, что автоматическое преобразование типа double в тип int не выполняется.

Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значения отбрасываются. Когда же значение с плавающей точкой приводится к целочисленному, в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней останется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна.

Ниже приведен пример программы, демонстрирующий некоторые виды преобразований, требующие явного приведения типов. // Демонстрация приведения типов, class CastDemo { public static void main(String args[]) { double x, y; byte b; int i; char ch; x = 10.0; У = 3.0; // В данном случае теряется дробная часть числа. i = (int) (х / у); // привести тип double к типу int System.out.println("Integer outcome of x / y: " + i) ; i = 100; // А в этом случае данные не теряются. Тип byte может // содержать значение 100. Ъ = (byte) i; System.out.println ("Value of b: " + b) ; i = 257; //На этот раз данные теряются. Тип byte не может // содержать значение 257. b = (byte) i; System.out.println("Value of b: " + b); b = 88; // Представление символа X в коде ASCII. //И снова требуется явное приведение несовместимых типов. ch = (char) b; System.out.println("ch: " + ch); } }