I мог бы просто процитировать что-то из JLS раздела 5.2 и сказать: «Это работает так, потому что язык spe c так говорит», но это не удовлетворяло бы это?
Мое образованное предположение о том, почему спроектирован такой язык:
При преобразовании 65
в char
то, что вы действительно делаете, просто удаление группы незначительных 0 в двоичном представлении, поскольку char
является 16-разрядным, тогда как int
является 32-разрядным. Это похоже на поворот от 0065 до 65.
С другой стороны, 65.0
- это double
и представлено в формате с плавающей запятой . Обратите внимание, что, как правило, это представление является лишь приближением к истинному значению. Смотрите этот пост для получения дополнительной информации. Чем больше бит, тем лучше приближение. Таким образом, преобразование из double
(64 бита) в float
(32 бита) похоже на преобразование 0,333333 в 0,333. Надеюсь, вы согласитесь, что это большая потеря информации, чем поворот с 0065 на 65. Следовательно, это не преобразование, которое должно выполняться автоматически. Программисты должны знать, что это происходит.
В любом случае, вот соответствующая часть языка spe c для полноты:
Контексты назначения позволяют используйте одно из следующего:
...
Кроме того, если выражение является константным выражением (§15.28) типа byte
, short
, char
, или int
:
- Может использоваться сужающее примитивное преобразование, если тип переменной - byte, short или char, а значение константного выражения представимо в типе переменной .
Таким образом, язык spe c дает специальную обработку byte, short, char и int, позволяя им сужать преобразование в контексте присваивания. Обратите внимание, что выражение должно быть: