Поведение компилятора Java во время преобразования сужающих примитивовJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Поведение компилятора Java во время преобразования сужающих примитивов

Сообщение Anonymous »

К.Сьерра и Б.Бейтс в своей книге "SCJP Study Guide" пишут

"Ниже допустимый байт b = 27; но только потому, что компилятор автоматически сужает буквальное значение до байта. Другими словами, компилятор вводит приведение. Предыдущий код идентичен следующему: byte b = (byte). 27;"

На мой взгляд, это объяснение неверно. Эти две строки кода идентичны?

На самом деле

Код: Выделить всё

byte b = 27;
это просто константа. И сужение констант во время компиляции — единственная причина, по которой этот код действителен. Так что никакой актерский состав не нужен. При сужении компилятор просто проверяет, соответствует ли указанное значение типу переменной.
В спецификации сказано:


Сужение примитивное преобразование можно использовать, если тип переменной — byte, short или char, а значение константного выражения можно представить в виде тип переменной.


Во втором случае

Код: Выделить всё

byte b = (byte) 27;
Приведение происходит во время выполнения, и примитивное значение вычисляется в соответствии с определенными правилами. Компилятор не заботится о совместимости примитивных типов. Например

Код: Выделить всё

byte b = 5.0; // compile error
byte b = 277777777; // compile error
byte b = (byte) 5.0; // valid!
byte b = (byte) 277777777; // valid!!
Это заставляет меня думать, что расширение/сужение преобразования и приведение — это принципиально разные вещи. Но в различных источниках они часто используются как взаимозаменяемые. Это правильно? Происходит ли приведение скрыто в случае неявного сужающего преобразования?

Может ли кто-нибудь объяснить реальное поведение компилятора в ситуации, описанной в книге выше?

Подробнее здесь: https://stackoverflow.com/questions/172 ... conversion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»