Спецификация языка Java, глава 5.2. Контексты присваивания говорят:
Кроме того, если выражение является константным выражением ( §15.29 ) типа byte
, short
, char
, или int
:
- Может использоваться сужающее примитивное преобразование, если переменная имеет тип
byte
, short
или char
, а значение константного выражения представимо в тип переменной.
В выражении char a = '1'-48
выражение является константным выражением типа int
, поэтому присваивание допустимо.
In оператор char a = '1'-48.0
, выражение является константным выражением типа double
, поэтому присваивание недопустимо.
Это даже не работает для long
, например, char a = '1'-48L
тоже не удастся.
Приведенное выше правило, разрешающее неявное сужающее примитивное преобразование константного выражения, было добавлено в язык для упрощения присвоения константных выражений примитиву "ниже" int
, поскольку все операторы неявно "повышают" значения до int
, Это делается для "отмены" этого расширения до int
, чтобы не допустить присвоения какого-либо константного выражения без приведения.