Преобразование типов
Иногда значение одного типа нужно превратить в другой: целое число — в дробное, дробное — в целое, строку "42" — в число. Часть преобразований Java делает сама, остальные нужно попросить явно.
Автоматическое расширение
Если значение переходит в тип, который вмещает больше, Java преобразует его сама. Это называется расширением: int → long → double. Данные при этом не теряются:
void main() {
int count = 42;
long big = count;
double precise = count;
IO.println(big);
IO.println(precise);
}Результат:
42
42.0Явное приведение
Обратное направление опасно: дробная часть или старшие разряды могут потеряться. Поэтому Java требует явного приведения — тип в скобках перед значением:
void main() {
double price = 9.99;
int whole = (int) price;
IO.println(whole);
}Результат:
9Приведение к int отбрасывает дробную часть, а не округляет. Для округления есть Math.round(): Math.round(9.99) вернёт 10. А при приведении большого целого к меньшему типу старшие разряды отбрасываются: (byte) 200 даёт -56. Другие математические методы и точные вычисления с деньгами разобраны в уроке Math и BigDecimal.
Дробное деление
Приведение помогает получить дробный результат из двух целых. Достаточно привести одно из чисел к double до деления:
void main() {
int done = 7;
int total = 8;
double part = (double) done / total;
IO.println(part);
}Результат:
0.875Символы и числа
Каждый символ char хранится как число — его код в таблице Unicode. Приведение показывает этот код и превращает код обратно в символ:
void main() {
char letter = 'A';
IO.println((int) letter);
IO.println((char) 66);
}Результат:
65
BСтроки и числа
Строку с цифрами нельзя привести через скобки — для этого есть методы Integer.parseInt() и Double.parseDouble(). Обратно число превращает в строку String.valueOf():
void main() {
int quantity = Integer.parseInt("3");
double price = Double.parseDouble("2.5");
IO.println(quantity * price);
String text = String.valueOf(100);
IO.println(text + "!");
}Результат:
7.5
100!Такие преобразования нужны постоянно: всё, что вводит пользователь или приходит из файла, сначала является строкой.
Частая ошибка
Если в строке есть хоть один посторонний символ, parseInt() выбрасывает исключение — сигнал об ошибке, который останавливает программу:
void main() {
int age = Integer.parseInt("25 лет");
IO.println(age);
}Результат:
Exception in thread "main" java.lang.NumberFormatException: For input string: "25 лет"Пробелы тоже считаются посторонними символами. Как перехватывать исключения и не давать программе падать, расскажет глава об ошибках.