В дополнение к другим ответам, в которых подробно изложены правила, я думаю, что также стоит подумать, почему так должно быть. Предположим, вы сделали
2.7F * 2L
Настоящий математический ответ на это умножение - 5.4. Поэтому, если ответ был long
, он должен был бы быть 5L
(5 - ближайшее целое число до 5.4). Из-за такого рода вещей гораздо более важно, чтобы результат умножения значения с плавающей запятой на целое число считался значением с плавающей запятой. Я думаю, что будет много вопросов об этом в Stack Overflow, если следующая строка кода напечатана 5
.
System.out.println(2.7F * 2L);
Фактически он печатает 5.4
.
Также имеет смысл, что все операции между целыми типами (кроме long
) выполняются с помощью int
. В конце концов, byte
обычно считается небольшим пакетом данных, а char
обычно считается персонажем. Из этих перспектив умножение значений byte
или char
значений не имеет смысла. Намного больше смысла держать правила простыми и просто выполнять операции с int
.
Это подробно описано в Спецификации языка Java. Существует целая глава [Конверсии и контексты] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html). –
https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2 –